Создать выпадающую область «панель» с ленты WPF?

#wpf #xaml #ribbon #system.windows.controls.ribbon

#wpf #xaml #лента #system.windows.controls.ribbon

Вопрос:

Лента WPF (System.Windows.Элементы управления.Лента) включает в себя ряд элементов управления, которые вы можете добавить на свою ленту, имеющих поведение в стиле «выпадающий», когда нажатие главной кнопки элемента управления показывает вам новую область.

Примеры: RibbonMenuButton, RibbonSplitButton, RibbonMenuButton, RibbonGallery и т.д.

Однако, насколько я могу видеть, все они предназначены для отображения списка объектов, из которых пользователь делает выбор. Но есть ли какой-либо способ вместо этого отобразить область «панель», которая не выбирается, на которую можно было бы поместить другие элементы управления?

В качестве примера, вот скриншот из MS Outlook:

введите описание изображения здесь

Верхняя красная область сама по себе не является выделением в списке. Вместо этого у него есть пользовательский элемент управления (средство выбора размера таблицы).

Но синие элементы — ЭТО выбираемые элементы, которые функционируют как традиционное меню.

Это красная область, которую мне интересно понять.

(Я не знаю, был ли Outlook закодирован с использованием ленты WPF, и это вообще не имеет значения — я просто использую это как иллюстрацию того, что я ищу.)


Примечание — я не пытаюсь специально копировать это средство выбора таблиц Outlook, это просто пример того, как вы могли бы использовать область «панель», которую нельзя выбрать, в области выпадающего списка.

Комментарии:

1. Мне удалось заменить шаблон RibbonGalleryItem на ControlTemplate, содержащий StackPanel с метками и флажками. Я мог бы взаимодействовать с флажками без того, чтобы элемент RibbonGalleryItem был «выбран»; если бы я поставил IsHitTestVisible = «False» на ярлыках, я мог бы щелкнуть по чему-либо в stackpanel, и это не «выбрало» бы элемент RibbonGalleryItem. Вы можете заменить содержимое вместо шаблона, но тогда, даже если содержимое непрозрачно, вы все равно получите оформление выделения вокруг него при наведении курсора мыши. Не привлекательно, IMO.

2. К сожалению, кажется, что лента просто не предназначена для поддержки этого пользовательского интерфейса.

Ответ №1:

Microsoft RibbonMenuButton / RibbonSplitButton не будут поддерживать пользовательские элементы управления в выпадающем списке.

Даже если нам удастся сделать это, изменив содержимое RibbonMenuItem / RibbonGalleryItem, мы все равно получим оформление выделения вокруг этих элементов управления при наведении курсора мыши

Лучший способ — использовать комбинацию RibbonToggleButton и всплывающего элемента управления, как показано ниже

Затем вы можете поместить любой пользовательский элемент управления, который вы хотите, внутри этого всплывающего элемента управления

 <StackPanel Orientation="Vertical">
<RibbonToggleButton
            x:Name="yAxis"
            Label="Y Axis"
            SmallImageSource="..ImagesChartYAxis16.png"
            LargeImageSource="..ImagesChartYAxis32.png"
            RibbonTwoLineText.HasTwoLines="True"
            RibbonTwoLineText.PathData="M 0 0 L 2.5 3 L 5 0 Z">
        </RibbonToggleButton>
        <Popup
            IsOpen="{Binding IsChecked, ElementName=yAxis}">
            <mycontrols:AnyControl/>
        </Popup>
    </StackPanel>
  

введите описание изображения здесь

Конечно, вам может потребоваться обработать закрытие выпадающего списка программно, сняв флажок togglebutton всякий раз, когда пользователь нажимает за пределами кнопки переключения или выпадающего всплывающего окна

Ответ №2:

Вы можете поместить все, что вам нравится, внутрь ribbonmenubutton.

Например:

     <Ribbon>
        <RibbonMenuButton Label="Button One">
            <Grid Height="100" Width="200">
                <TextBlock VerticalAlignment="Top" Text="AAAA"/>
                <TextBlock VerticalAlignment="Bottom" Text="ZZZZ"/>
            </Grid>
        </RibbonMenuButton>
    </Ribbon>
  

Вы бы хотели извлечь и изменить шаблон ribbonmenubutton, чтобы избежать разрыва слева.

Комментарии:

1. Хотя здесь отображаются пользовательские элементы (текстовые блоки в примере), вся область сетки по-прежнему является выбираемым элементом списка, чего я пытаюсь избежать.

2. Вы могли бы указать значение isfocusable false, чтобы избежать выделения или остановить изменение фона выбранного элемента в шаблоне. Альтернативой является ваш собственный элемент управления с помощью кнопки переключения и сопряжения всплывающих окон. Затем вы точно контролируете, что она делает.

3. Установка Focusable=»False» никак не влияет на возможность выбора выпадающей области.

Ответ №3:

Для prosperity в настоящее время это невозможно. Похоже, что RibbonMenuButton использует частное всплывающее окно для отображения содержимого выпадающего списка.

Источник: https://github.com/dotnet/wpf/blob/main/src/Microsoft .DotNet.Wpf/src/System.Windows.Элементы управления.Ribbon/Microsoft/Windows/Controls/Ribbon/RibbonMenuButton.cs Строки 1309 и 1335.