WPF 工具栏:如何移除抓手和溢出

106
在一个嵌套的WPF ToolBarPanel-ToolBar-Menu中,我们想要去掉左边的手柄和右边的溢出区域。它们都是灰色的,但我们想要完全不显示它们。
有什么办法可以实现这个目标吗?
万一我的术语并不完全正确,如果您查看下面链接中图3中的图像,在三个工具栏中最低的工具栏上方,有一个下拉菜单左侧的手柄,以及在最右侧按钮的右侧有溢出菜单。 工具栏的图像

你可能可以通过覆盖控件模板来实现...但我不建议这样做。 - apandit
你可以在工具栏上加上Margin="0,0,-14,0",将右侧推出视图。这是我找到的最简单的解决方案,但我只测试了单个工具栏,而不是在ToolBarPanel或ToolBarTray中。 - Wayne Bloss
6个回答

176

将工具栏锁定可以通过在工具栏上设置附加属性ToolBarTray.IsLocked="True"来实现。

要删除溢出切换按钮,您需要像sixlettervariables建议的那样在自定义ControlTemplate中删除它。如果您有Blend或者可以下载Blend 3 Preview,这并不太困难。

您也可以在ToolBar的loaded事件中隐藏该按钮。不过,无论采用哪种方法,您还应该在工具栏菜单上设置附加属性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>

并将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();
    }
}

18
"顺带一提,为什么要使用工具栏?为什么不只是用一个简单的按钮堆叠面板(StackPanel)?工具栏有什么好处呢?" - Josh G
5
回答Josh G的问题:如果您在一个普通的面板(如StackPanel等)上使用带有图像的透明按钮,它将具有白色轮廓线。但是当相同的按钮放置在工具栏上时,白色轮廓线就不会出现了。 - Chris Bennet
2
如果您想在此上下文中使用工具栏的主题,例如鼠标悬停行为,这也非常有用。 - Greg D
38
FYI:您可以使用简单的StackPanel,仍然可以获得工具栏样式。<Button Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}"> <Image Source="{StaticResource ZoomIn}"></Image> </Button> - thrag
1
@thrag 你应该把它变成一个答案。太棒了! - Eternal21
显示剩余3条评论

11

你可以通过将ToolBar设置为负右边距(并添加负左边距,以便在具有圆角左边缘但方形右边缘时不会显得奇怪),而无需提供新的控件模板来“删除”溢出内容。 然后,在ToolBarPanel中添加ClipToBounds="True",这将剪切现在超出面板区域的工具栏的边缘。

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

8

您可以使用Blend相对简单地覆盖ToolBarPanel、Menu或ToolBar的ControlTemplate。

  1. 右键单击工具栏并选择编辑模板
  2. 从“编辑模板”中,选择“编辑副本”
  3. 我建议将副本添加到资源字典中
  4. 点击确定

现在您将编辑ToolBarPanel的控件模板,并可以将握把和溢出信号的可见性设置为Collapsed。您可以为其他控件重复此操作。这可能有点耗时,但使用Blend并不是非常困难。


感谢提供的信息。不幸的是,对于我们来说,Blend2和VS2008似乎无法很好地配合使用,当一个在另一个中生成的代码与之交互时会出现太多问题,因此我们目前不允许Blend接近我们的VS代码 ;) - Tom
1
是的,我们一直相当虔诚地使用Blend,直到VS2k8SP1出现。实际上,我有点希望VS2k8中的WPF编辑器就是Blend。这样就可以更轻松地右键单击某个对象并说“分组为'StackPanel'或'Border'”了。可惜微软希望它们成为不同的体验。 - user7116
我认为新的XAML Power Toys添加了一项功能,允许您对控件进行分组。(也许是MoXAML Power Toys...) - Number8

6

我认为,与其完全隐藏溢出按钮,只有在必要时显示它更好。可以通过将其可见性属性绑定到其启用状态属性来实现:

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>

对于垂直布局,请在工具栏(或者如果使用的话,是工具栏托盘)之后放置上述内容。

使用任何所需的按钮宽度和高度。

Kaxaml非常适合用来尝试这些东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接