首页 文章

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

提问于
浏览
89

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

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

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

Image of toolbars

6 回答

  • 137

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

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

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

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

    您可以use Blend to rather simply override the ControlTemplate用于ToolBarPanel,Menu或ToolBar .

    • 右键单击工具栏并选择编辑模板

    • 从“编辑模板”中,选择“编辑副本”

    • 我建议将副本添加到资源字典中

    • 单击“确定”

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

  • 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">
        . . .
    
  • 8

    而不是完全隐藏溢出按钮,我认为最好只在必要时显示它 . 这可以通过将 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中完成同样的事情)

  • 0

    我刚刚开始使用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>
    
  • 4

    上述方法可以隐藏溢出;我用以下内容隐藏了抓手:

    <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非常适合玩这种东西 .

相关问题