Панель инструментов WPF: как убрать сцепление и переполнение - PullRequest
91 голосов
/ 26 июня 2009

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

есть идеи, как этого добиться?

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

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

Ответы [ 6 ]

144 голосов
/ 27 июня 2009

Ручку можно снять, установив прикрепленное свойство ToolBarTray.IsLocked="True" на панели инструментов.

Чтобы удалить переполнение ToggleButton , вам нужно будет удалить его в пользовательском шаблоне ControlTemplate, как подсказывает Sixlettervariables, что, если у вас есть blend или вы можете загрузить Blend 3 Preview, не слишком сложно.

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

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

И установите переполнение ToggleButton в свернутом виде:

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();
    }
}
8 голосов
/ 27 июня 2009

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

  1. Щелкните правой кнопкой мыши на панели инструментов и выберите «Редактировать шаблон»
  2. В Редактировать шаблон выберите Редактировать копию
  3. Я рекомендую добавить копию в словарь ресурсов
  4. Нажмите Ok

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

5 голосов
/ 26 ноября 2014

Вы можете «удалить» переполнение, не предоставляя новый шаблон элемента управления, установив 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 голосов
/ 03 сентября 2015

Вместо того, чтобы полностью скрывать кнопку переполнения, я думаю, что лучше показывать ее только при необходимости. Это можно сделать, привязав его свойство 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, переопределив шаблон)

3 голосов
/ 18 августа 2013

Я только начинаю с 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>
0 голосов
/ 14 апреля 2013

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

         <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 отлично подходит для игры с этим материалом.

...