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

98

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

какие-нибудь идеи о том, как это сделать?

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

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

Том
источник
Вероятно, вы могли бы сделать это, перезаписав шаблон элемента управления ... но я бы не рекомендовал это.
apandit
Вы можете поместить Margin = "0,0, -14,0" на ToolBar, чтобы убрать правую сторону из поля зрения. Это самое простое решение, которое я нашел, но я тестировал только одну ToolBar, а не внутри ToolBarPanel или ToolBarTray.
Уэйн Блосс

Ответы:

153

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

Чтобы удалить ToggleButton переполнения , вам нужно будет удалить его в настраиваемом ControlTemplate, как предлагает шестизначные переменные, что, если у вас есть blend или вы можете загрузить предварительный просмотр 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>

И установите Overflow 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();
    }
}
Рмур
источник
15
Напрашивается вопрос: зачем вообще использовать ToolBar? Почему бы просто не использовать простую панель StackPanel с кнопками? Какие преимущества дает ToolBar?
Josh G
5
Отвечая Джошу Джи: Если вы используете прозрачную кнопку с изображением на обычной панели (StackPanel и т. Д.), Она будет иметь белый контур. Однако, когда та же кнопка размещается на панели инструментов, белого контура нет.
Крис Беннет
2
Это также полезно, если вы хотите тематизировать панель инструментов в этом контексте, например, при наведении курсора мыши.
Greg D
36
К вашему сведению: вы можете использовать простую панель StackPanel и при этом получить стиль панели инструментов. <Button Style = "{StaticResource {x: Static ToolBar.ButtonStyleKey}}"> <Image Source = "{StaticResource ZoomIn}"> </Image> </Button>
thrag
1
Кроме того, я обнаружил, что если вы не хотите использовать элемент управления <Menu> на панели инструментов, свойство ToolBar.OverflowMode = "Never" можно установить непосредственно внутри элемента управления <Button> на панели инструментов. Это создало эффект, который я искал
ford
8

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

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

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

user7116
источник
Спасибо за информацию. к сожалению, blend2 и vs2008, похоже, не очень хорошо работают вместе для нас, слишком много проблем, когда один работает с кодом, сгенерированным в другом, поэтому в настоящее время мы не позволяем blend приближаться к нашему коду vs;)
Том
1
Да, мы довольно неукоснительно использовали Blend, пока не появился VS2k8SP1. На самом деле, мне бы хотелось, чтобы редактор WPF в VS2k8 WAS Blend. Гораздо приятнее иметь возможность щелкнуть что-либо правой кнопкой мыши и сказать «Группировать в StackPanel» или «Граница». Жаль, что MS хочет, чтобы у них был другой опыт.
user7116
Я думаю, что в новом XAML Power Toys добавлена ​​функция, позволяющая группировать элементы управления. (Может быть, это MoXAML Power Toys ...)
Number8
8

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

<ToolBarPanel Grid.Row="0" ClipToBounds="True">
    <ToolBar ToolBarTray.IsLocked="True" Margin="-5,0,-13,0" Padding="5,0,0,0">
    . . .
Джон Фишер
источник
5

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

Я только начинаю работать с 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

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

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

Фредиано
источник