WPF ToolBar:如何删除夹点和溢出

Tom*_*Tom 94 wpf toolbar

在嵌套的WPF ToolBarPanel-ToolBar-Menu中,我们想要摆脱左边的握柄和右边的溢出区域.它们都是灰色的,但我们希望它们根本不显示.

关于如何实现这一目标的任何想法?

为了防止我的术语不完全正确,如果您查看下面链接的图3中的图像,在三个工具栏的最低位置,下拉列表左侧和右侧最右侧的夹点按钮有溢出.

工具栏的图像

rmo*_*ore 148

可以通过ToolBarTray.IsLocked="True"在ToolBar上设置附加属性来移除夹点.

要删除Overflow ToggleButton,您必须在自定义ControlTemplate中删除它,因为六个变量建议,如果您已混合或可以下载Blend 3预览版并不是太困难.

您也可以在工具栏的已加载事件中隐藏按钮,但无论您采用哪种路径,还应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>
Run Code Online (Sandbox Code Playgroud)

并将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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考:您可以使用简单的StackPanel并仍然获得工具栏样式.<Button Style ="{StaticResource {x:Static ToolBar.ButtonStyleKey}}"> <Image Source ="{StaticResource ZoomIn}"> </ Image> </ Button> (35认同)
  • 提出问题:为什么要使用ToolBar?为什么不使用带按钮的简单StackPanel?ToolBar提供什么好处? (15认同)
  • 回答Josh G:如果你在普通面板(StackPanel等)上使用带有图像的透明按钮,它将具有白色轮廓.但是,当相同的按钮放在工具栏上时,白色轮廓不存在. (5认同)
  • 如果您希望在此上下文中设置工具栏的主题,例如鼠标悬停行为,这也很有用。 (2认同)

use*_*116 8

您可以使用Blend来简单地覆盖 ToolBarPanel,Menu或ToolBar 的ControlTemplate.

  1. 右键单击ToolBar并选择Edit Template
  2. 从"编辑模板"中,选择"编辑副本"
  3. 我建议将副本添加到资源字典中
  4. 单击确定

您现在将编辑ToolBarPanel的控件模板,并可以为夹点和溢出信号设置Collapsed的可见性.您可以冲洗并重复其他控件.这有点耗时,但使用Blend并不是很难.


Joh*_*her 6

您可以通过设置ToolBar为具有负右边距来"移除"溢出而不提供新的控制模板(并且投入负左边距,因此它看起来不奇怪,左边是圆边而是右边边缘).然后,添加ClipToBounds="True"ToolBarPanel将切断工具栏边缘的区域,这些区域现在粘在面板区域之外.

<ToolBarPanel Grid.Row="0" ClipToBounds="True">
    <ToolBar ToolBarTray.IsLocked="True" Margin="-5,0,-13,0" Padding="5,0,0,0">
    . . .
Run Code Online (Sandbox Code Playgroud)


Tho*_*que 6

与其完全隐藏溢出按钮,我认为最好仅在必要时显示它。这可以通过将其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;
    }
}
Run Code Online (Sandbox Code Playgroud)

(同样的事情可以通过重新定义模板在 XAML 中完成)