WPF工具栏:如何消除握力和溢出


97

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

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

以防万一我的说法不完全正确,如果您查看下面链接的图3中的图像,则在三个工具栏的最下方,下拉菜单的左侧和最右侧的右侧都有夹子按钮有溢出。

工具栏图片


您可能可以通过覆盖控件模板来做到这一点……但我不建议这样做。
apandit

您可以在工具栏上放置Margin =“ 0,0,-14,0”,以将右侧推出视图。这是我找到的最简单的解决方案,但我仅使用单个ToolBar进行了测试,而不是在ToolBarPanel或ToolBarTray内。
韦恩·布鲁斯

Answers:


152

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

删除溢出切换按钮,您必须按照sixlettervariables建议在自定义ControlTemplate中将其删除,如果您有Blend或可以下载Blend 3 Preview,这并不太困难。

您也可以仅将按钮隐藏在ToolBar的已加载事件中,无论采取哪种路线,都应ToolBar.OverflowMode="Never"在ToolBar的菜单上设置Attached属性,以使项目不会意外溢出到无法访问的区域。

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

15
提出一个问题:为什么要完全使用工具栏?为什么不只使用带有按钮的简单StackPanel?工具栏有什么好处?
乔什·G

5
回答乔什G:如果您在普通面板(StackPanel等)上使用带有透明按钮的图像,它将具有白色轮廓。但是,当将相同的按钮放置在工具栏上时,则没有白色轮廓。
克里斯·本内特

2
如果要在此上下文中设置工具栏的主题(例如,鼠标悬停行为),这也很有用。
格雷格D

36
仅供参考:您可以使用简单的StackPanel并仍然获得工具栏样式。<Button Style =“ {StaticResource {x:Static ToolBar.ButtonStyleKey}}”>“> <Image Source =” {StaticResource ZoomIn}“> </ Image> </ Button>
拖拉

1
此外,我发现如果您不想在工具栏中使用<Menu>控件,则可以直接在工具栏中的<Button>控件内设置ToolBar.OverflowMode =“ Never”属性。这创造了我一直在寻找的效果
福特

8

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

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

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


谢谢(你的)信息。不幸的是blend2和vs2008对于我们似乎无法很好地协同工作,当一个人使用另一个人生成的代码时会出现太多问题,因此我们目前不让Blends靠近我们的vs代码;)
Tom

1
是的,我们相当虔诚地使用Blend,直到VS2k8SP1出现为止。实际上,我有点希望VS2k8 WAS Blend中的WPF编辑器。能够右键单击某些内容并说出“ Group In into” StackPanel”或“ Border”,这要好得多。太糟糕的MS希望他们成为不同的经历。
user7116

我认为新的XAML Power Toys添加了一项功能,使您可以对控件进行分组。(也许是MoXAML电动玩具...)
09年

8

您可以通过将设置ToolBar为负负边距来“消除”溢出,而无需提供新的控件模板(并输入负负左边距,以使左边缘不是圆角而是右边缘是奇数)。然后,添加ClipToBounds="True"ToolBarPanel它会切断它们现在贴在面板的区域以外的工具栏的边缘。

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

5

我认为与其只完全隐藏溢出按钮,不如仅在必要时显示它。这可以通过将其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中完成相同的操作)


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.