WPF ToolBar: как удалить захват и переполнение

В вложенном WPF ToolBarPanel-ToolBar-Menu мы хотим избавиться от руля захвата слева и области переполнения справа. они оба выделены серым цветом, но мы бы хотели, чтобы они вообще не отображались.

любые идеи о том, как это сделать?

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

Изображение панелей инструментов

Ответ 1

Захват можно удалить, установив прикрепленное свойство ToolBarTray.IsLocked="True" в ToolBar.

Чтобы удалить Overflow ToggleButton, вам нужно будет удалить его в пользовательском элементе ControlTemplate, как предполагает предложение sixlettervariables, которое, если у вас есть смесь или вы можете скачать Предварительный просмотр Blend 3 не слишком сложный.

Вы также можете просто скрыть кнопку в загруженном событии ToolBar, хотя какой бы маршрут вы ни выбрали, вы также должны установить прикрепленное свойство ToolBar.OverflowMode="Never" в меню ToolBar, чтобы элементы не могли случайно переполниться в недоступную область.

<ToolBarPanel DockPanel.Dock="Top">
    <ToolBar ToolBarTray.IsLocked="True" Loaded="ToolBar_Loaded">
        <Menu ToolBar.OverflowMode="Never">
            <MenuItem Header="File" />
            <MenuItem Header="New" />
        </Menu>
    </ToolBar>
</ToolBarPanel>

И установите OverflowButton переполнения:

private void ToolBar_Loaded(object sender, RoutedEventArgs e)
{
    ToolBar toolBar = sender as ToolBar;
    var overflowGrid = toolBar.Template.FindName("OverflowGrid", toolBar) as FrameworkElement;
    if (overflowGrid != null)
    {
        overflowGrid.Visibility = Visibility.Collapsed;
    }
    var mainPanelBorder = toolBar.Template.FindName("MainPanelBorder", toolBar) as FrameworkElement;
    if (mainPanelBorder != null)
    {
        mainPanelBorder.Margin = new Thickness();
    }
}

Ответ 2

Вы можете использовать Blend, чтобы просто переопределить ControlTemplate для ToolBarPanel, Menu или ToolBar.

  • Щелкните правой кнопкой мыши на панели инструментов и выберите "Редактировать шаблон"
  • В разделе "Редактировать шаблон" выберите "Редактировать копию"
  • Я рекомендую добавить копию в словарь ресурсов
  • Нажмите Ok

Теперь вы редактируете шаблон управления для ToolBarPanel и можете установить видимость на Collapsed для сигнала захвата и переполнения. Вы можете промыть и повторить для других элементов управления. Это немного трудоемко, но не очень сложно с Blend.

Ответ 3

Вы можете "удалить" переполнение без подачи нового шаблона управления, установив ToolBar на отрицательные правые поля (и выбросьте отрицательное левое поле, чтобы оно не выглядело нечетным с закругленными левыми краями, но с квадратными правыми краями). Затем добавьте ClipToBounds="True" в ToolBarPanel, который отрежет края панели инструментов, которые теперь торчат вне области панели.

<ToolBarPanel Grid.Row="0" ClipToBounds="True">
    <ToolBar ToolBarTray.IsLocked="True" Margin="-5,0,-13,0" Padding="5,0,0,0">
    . . .

Ответ 4

Вместо того, чтобы полностью скрывать кнопку переполнения, я думаю, что лучше показать ее только тогда, когда это необходимо. Это можно сделать, привязывая его свойство Visibility к свойству IsEnabled:

private static void FixupToolBarOverflowArrow(ToolBar toolBar)
{
    Action fixup = () =>
    {
        var overflowButton = toolBar.Template.FindName("OverflowButton", toolBar) as ButtonBase;
        if (overflowButton != null)
        {
            overflowButton.SetBinding(
                VisibilityProperty,
                new Binding("IsEnabled")
                {
                    RelativeSource = RelativeSource.Self,
                    Converter = new BooleanToVisibilityConverter()
                });
        }
    };

    if (toolBar.IsLoaded)
    {
        fixup();
    }
    else
    {
        RoutedEventHandler handler = null;
        handler = (sender, e) =>
        {
            fixup();
            toolBar.Loaded -= handler;
        };

        toolBar.Loaded += handler;
    }
}

(то же самое можно сделать в XAML, переопределив шаблон)

Ответ 5

Я только начинаю работать с WPF и не могу получить какой-либо из вышеперечисленных методов, чтобы скрыть мою стрелку переполнения (Visual Studio 2010). Единственное, что, казалось, повлияло на стрелку, было примером Toolbar_Load выше, но все, что было сделано, было поворотным стрелка в пустое пространство, которое выглядело так же плохо, как стрела. Самый простой способ, который я мог понять, - это просто установить поля панели инструментов.

<ToolBar Height="26" 
         Name="toolBar" 
         DockPanel.Dock="Top" 
         ToolBarTray.IsLocked="True" 
         ToolBar.OverflowMode="Never"        <!-- no effect -->
         Margin="0,0,-13,0">                 <!-- worked -->
         <Menu ToolBar.OverflowMode="Never"> <!-- no affect -->
             <MenuItem Header="_File"></MenuItem>
         </Menu>
</ToolBar>

Ответ 6

Методы выше работают, чтобы скрыть переполнение; Я использовал следующее, чтобы скрыть захват:

         <Label Height="44" Width="30" Background="{StaticResource CtrlBackground}" Margin="-20,0,0,0"></Label>

для горизонтальной компоновки и

         <Label Height="44" Width="230" Background="{StaticResource CtrlBackground}" Margin="0,-20,0,0" HorizontalAlignment="Left"></Label>

для вертикальной компоновки. Разместите это выше после панели инструментов (или ToolbarTray, если используете это)

Используйте для этого кнопки любую ширину и высоту.

Kaxaml отлично подходит для игры с этим материалом.