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

时间:2009-06-26 19:53:51

标签: wpf toolbar

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

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

以防万一我的条款不完全正确,如果您查看下面链接图3中的图像,在三个工具栏的最低位置,下拉菜单左侧的夹点和右侧的夹点最右边的按钮就是溢出。

Image of toolbars

6 个答案:

答案 0 :(得分:142)

可以通过在工具栏上设置附加属性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();
    }
}

答案 1 :(得分:8)

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

  1. 右键单击工具栏并选择编辑模板
  2. 从“编辑模板”中,选择“编辑副本”
  3. 我建议将副本添加到资源字典
  4. 点击确定
  5. 您现在将编辑ToolBarPanel的控件模板,并可以为夹点和溢出信号设置Collapsed的可见性。您可以冲洗并重复其他控件。这有点耗时,但使用Blend并不是很难。

答案 2 :(得分:5)

你可以通过将ToolBar设置为具有负右边距来“移除”溢出而不提供新的控制模板(并且输入负的左边距,因此左边的边缘看起来并不奇怪但是正方形右边缘)。然后,将ClipToBounds="True"添加到ToolBarPanel,这将切断现在位于面板区域外的工具栏边缘。

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

答案 3 :(得分: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中完成同样的事情)

答案 4 :(得分: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>

答案 5 :(得分: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非常适合玩这种东西。