WPF 工具栏:如何删除夹点和溢出

Posted

技术标签:

【中文标题】WPF 工具栏:如何删除夹点和溢出【英文标题】:WPF ToolBar: how to remove grip and overflow 【发布时间】:2010-11-06 06:17:48 【问题描述】:

在嵌套的 WPF ToolBarPanel-ToolBar-Menu 中,我们希望摆脱左侧的把手和右侧的溢出区域。它们都是灰色的,但我们希望它们根本不显示。

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

以防我的术语不完全正确,如果您查看下面链接的图 3 中的图像,在三个工具栏的最底部,下拉菜单左侧和右侧的夹点最右边的按钮有溢出。

Image of toolbars

【问题讨论】:

你可以通过覆盖控制模板来做到这一点......但我不推荐它。 您可以将 Margin="0,0,-14,0" 放在工具栏上以将右侧推到视野之外。这是我找到的最简单的解决方案,但我只用一个 ToolBar 进行了测试,而不是在 ToolBarPanel 或 ToolBarTray 内。 【参考方案1】:

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

要删除Overflow ToggleButton,您必须按照sixlettervariables 的建议在自定义ControlTemplate 中删除它,如果您有blend 或可以下载Blend 3 Preview,这并不太难。

您也可以在 ToolBar 的加载事件中隐藏按钮,但无论您采用哪种方式,您还应该在 ToolBar 的菜单上设置附加属性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>

并将溢出切换按钮设置为折叠:

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();
    

【讨论】:

提出一个问题:为什么要使用工具栏?为什么不直接使用带有按钮的简单 StackPanel?工具栏有什么好处? 回答 Josh G:如果您在普通面板(StackPanel 等)上使用带有图像的透明按钮,它将具有白色轮廓。但是,当将相同的按钮放置在 ToolBar 上时,不会出现白色轮廓。 如果您想在此上下文中对工具栏进行主题化,这也很有用,例如鼠标悬停行为。 仅供参考:您可以使用简单的 StackPanel 并仍然获得工具栏样式。 此外,我发现如果您不想在工具栏中使用 控件,可以直接在工具栏中的 【参考方案2】:

您可以use Blend to rather simply override the ControlTemplate 使用 ToolBarPanel、Menu 或 ToolBar。

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

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

【讨论】:

感谢您的信息。不幸的是,blend2 和 vs2008 对我们来说似乎不能很好地协同工作,当一个与另一个生成的代码一起工作时会出现太多问题,所以我们目前不让 blend 靠近我们的 vs 代码;) 是的,我们非常虔诚地使用 Blend,直到 VS2k8SP1 出现。实际上我有点希望 VS2k8 WAS Blend 中的 WPF 编辑器。能够右键单击某些内容并说“分组到“堆栈面板”或“边框”要好得多。太糟糕了,MS 希望他们有不同的体验。 我认为新的 XAML Power Toys 添加了一项功能,允许您对控件进行分组。 (也许是 MoXAML Power Toys...)【参考方案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>

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

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

Kaxaml 非常适合玩这些东西。

【讨论】:

以上是关于WPF 工具栏:如何删除夹点和溢出的主要内容,如果未能解决你的问题,请参考以下文章

如何从UWP Map上的MapIcon中删除点和尾

WPF DataGrid 如何对选择的多行进行删除

如何动态添加/删除行? [WPF]

如何删除溢出-y的奇怪右边距:自动

如何从 WPF 树视图中删除边框

WPF - 如何删除“this.close()”效果?