在ToolBarTray中设置工具栏之间的间距

时间:2016-05-18 09:18:48

标签: c# wpf layout toolbar

我的ToolBarTray里面有多个ToolBar。我的目标是将所有这些工具栏与垂直线分开。 The ToolBarTray I want

目前,我已经对ToolBar类进行了细分,并以编程方式使工具栏的边框非圆角(默认边框有圆角)。但是,我无法摆脱工具栏之间的这种间距。 How the ToolBarTray looks like now

我完全可以删除ToolBarTray,而是使用Grid或StackPanel来实现这一点。但是,我需要保留工具栏可以拖动/重新安排的能力。

这有什么简单的解决方案吗?

2 个答案:

答案 0 :(得分:1)

使用此工具栏样式

<Window.Resources>
        <SolidColorBrush x:Key="ToolBarHorizontalBackground" Color="#FFEEF5FD"/>
        <SolidColorBrush x:Key="ToolBarToggleButtonVerticalBackground" Color="#FFEEF5FD"/>
        <SolidColorBrush x:Key="ToolBarButtonHover" Color="#210080FF"/>
        <SolidColorBrush x:Key="ToolBarGripper" Color="#FF6D6D6D"/>
        <Style x:Key="ToolBarVerticalOverflowButtonStyle" TargetType="{x:Type ToggleButton}">
            <Setter Property="Background" Value="{StaticResource ToolBarToggleButtonVerticalBackground}"/>
            <Setter Property="MinHeight" Value="0"/>
            <Setter Property="MinWidth" Value="0"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ToggleButton}">
                        <Border x:Name="Bd" Background="{TemplateBinding Background}" CornerRadius="0,0,3,3" SnapsToDevicePixels="true">
                            <Canvas HorizontalAlignment="Right" Height="6" Margin="2,7,2,2" SnapsToDevicePixels="true" VerticalAlignment="Bottom" Width="7">
                                <Path Data="M 1.5 1 L 1.5 6" Stroke="White"/>
                                <Path Data="M 0.5 0 L 0.5 5" Stroke="{TemplateBinding Foreground}"/>
                                <Path Data="M 3.5 0.5 L 7 3.5 L 4 6.5 Z" Fill="White"/>
                                <Path Data="M 3 -0.5 L 6 2.5 L 3 5.5 Z" Fill="{TemplateBinding Foreground}"/>
                            </Canvas>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter Property="Background" TargetName="Bd" Value="{StaticResource ToolBarButtonHover}"/>
                            </Trigger>
                            <Trigger Property="IsKeyboardFocused" Value="true">
                                <Setter Property="Background" TargetName="Bd" Value="{StaticResource ToolBarButtonHover}"/>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Foreground" Value="{StaticResource ToolBarGripper}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Source={x:Static SystemParameters.HighContrast}}" Value="true">
                    <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
        <SolidColorBrush x:Key="ToolBarVerticalBackground" Color="#FFEEF5FD"/>
        <SolidColorBrush x:Key="ToolBarToggleButtonHorizontalBackground" Color="#FFEEF5FD"/>
        <Style x:Key="ToolBarHorizontalOverflowButtonStyle" TargetType="{x:Type ToggleButton}">
            <Setter Property="Background" Value="{StaticResource ToolBarToggleButtonHorizontalBackground}"/>
            <Setter Property="MinHeight" Value="0"/>
            <Setter Property="MinWidth" Value="0"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ToggleButton}">
                        <Border x:Name="Bd" Background="{TemplateBinding Background}" CornerRadius="0,3,3,0" SnapsToDevicePixels="true">
                            <Canvas HorizontalAlignment="Right" Height="7" Margin="7,2,2,2" SnapsToDevicePixels="true" VerticalAlignment="Bottom" Width="6">
                                <Path Data="M 1 1.5 L 6 1.5" Stroke="White"/>
                                <Path Data="M 0 0.5 L 5 0.5" Stroke="{TemplateBinding Foreground}"/>
                                <Path Data="M 0.5 4 L 6.5 4 L 3.5 7 Z" Fill="White"/>
                                <Path Data="M -0.5 3 L 5.5 3 L 2.5 6 Z" Fill="{TemplateBinding Foreground}"/>
                            </Canvas>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter Property="Background" TargetName="Bd" Value="{StaticResource ToolBarButtonHover}"/>
                            </Trigger>
                            <Trigger Property="IsKeyboardFocused" Value="true">
                                <Setter Property="Background" TargetName="Bd" Value="{StaticResource ToolBarButtonHover}"/>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Foreground" Value="{StaticResource ToolBarGripper}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Source={x:Static SystemParameters.HighContrast}}" Value="true">
                    <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
        <SolidColorBrush x:Key="ToolBarMenuBorder" Color="#FFB6BDC5"/>
        <SolidColorBrush x:Key="ToolBarSubMenuBackground" Color="#FFEEF5FD"/>
        <Style x:Key="ToolBarThumbStyle" TargetType="{x:Type Thumb}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Thumb}">
                        <Border Background="Transparent" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="True">
                            <Rectangle>
                                <Rectangle.Fill>
                                    <DrawingBrush TileMode="Tile" Viewbox="0,0,4,4" Viewport="0,0,4,4" ViewportUnits="Absolute" ViewboxUnits="Absolute">
                                        <DrawingBrush.Drawing>
                                            <DrawingGroup>
                                                <GeometryDrawing Brush="White" Geometry="M 1 1 L 1 3 L 3 3 L 3 1 z"/>
                                                <GeometryDrawing Brush="{StaticResource ToolBarGripper}" Geometry="M 0 0 L 0 2 L 2 2 L 2 0 z"/>
                                            </DrawingGroup>
                                        </DrawingBrush.Drawing>
                                    </DrawingBrush>
                                </Rectangle.Fill>
                            </Rectangle>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter Property="Cursor" Value="SizeAll"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <Style x:Key="ToolBarMainPanelBorderStyle" TargetType="{x:Type Border}">
            <Setter Property="Margin" Value="0,0,11,0"/>
            <Setter Property="CornerRadius" Value="3,3,3,3"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Source={x:Static SystemParameters.HighContrast}}" Value="true">
                    <Setter Property="CornerRadius" Value="0,0,0,0"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
        <Style x:Key="ToolBarStyle1" TargetType="{x:Type ToolBar}">
            <Setter Property="Background" Value="{StaticResource ToolBarHorizontalBackground}"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ToolBar}">
                        <Grid x:Name="Grid" Margin="3,1,-3,1" SnapsToDevicePixels="true">
                            <!--<Grid x:Name="OverflowGrid" HorizontalAlignment="Right">
                                <ToggleButton x:Name="OverflowButton" ClickMode="Press" FocusVisualStyle="{x:Null}" IsChecked="{Binding IsOverflowOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" IsEnabled="{TemplateBinding HasOverflowItems}" Style="{StaticResource ToolBarHorizontalOverflowButtonStyle}"/>
                                <Popup x:Name="OverflowPopup" AllowsTransparency="true" Focusable="false" IsOpen="{Binding IsOverflowOpen, RelativeSource={RelativeSource TemplatedParent}}" PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}" Placement="Bottom" StaysOpen="false">
                                    <Themes:SystemDropShadowChrome x:Name="Shdw" Color="Transparent">
                                        <Border x:Name="ToolBarSubMenuBorder" BorderBrush="{StaticResource ToolBarMenuBorder}" BorderThickness="1" Background="{StaticResource ToolBarSubMenuBackground}" RenderOptions.ClearTypeHint="Enabled">
                                            <ToolBarOverflowPanel x:Name="PART_ToolBarOverflowPanel" KeyboardNavigation.DirectionalNavigation="Cycle" FocusVisualStyle="{x:Null}" Focusable="true" Margin="2" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" KeyboardNavigation.TabNavigation="Cycle" WrapWidth="200"/>
                                        </Border>
                                    </Themes:SystemDropShadowChrome>
                                </Popup>
                            </Grid>-->
                            <Border x:Name="MainPanelBorder" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" >
                                <DockPanel KeyboardNavigation.TabIndex="1" KeyboardNavigation.TabNavigation="Local">
                                    <Thumb x:Name="ToolBarThumb" Margin="-3,-1,0,0" Padding="6,5,1,6" Style="{StaticResource ToolBarThumbStyle}" Width="10"/>
                                    <ContentPresenter x:Name="ToolBarHeader" ContentSource="Header" HorizontalAlignment="Center" Margin="4,0,4,0" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Center"/>
                                    <ToolBarPanel x:Name="PART_ToolBarPanel" IsItemsHost="true" Margin="0,1,2,2" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                                </DockPanel>
                            </Border>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsOverflowOpen" Value="true">
                                <Setter Property="IsEnabled" TargetName="ToolBarThumb" Value="false"/>
                            </Trigger>
                            <Trigger Property="Header" Value="{x:Null}">
                                <Setter Property="Visibility" TargetName="ToolBarHeader" Value="Collapsed"/>
                            </Trigger>
                            <Trigger Property="ToolBarTray.IsLocked" Value="true">
                                <Setter Property="Visibility" TargetName="ToolBarThumb" Value="Collapsed"/>
                            </Trigger>
                            <!--<Trigger Property="HasDropShadow" SourceName="OverflowPopup" Value="true">
                                <Setter Property="Margin" TargetName="Shdw" Value="0,0,5,5"/>
                                <Setter Property="SnapsToDevicePixels" TargetName="Shdw" Value="true"/>
                                <Setter Property="Color" TargetName="Shdw" Value="#71000000"/>
                            </Trigger>-->
                            <Trigger Property="Orientation" Value="Vertical">
                                <Setter Property="Margin" TargetName="Grid" Value="1,3,1,1"/>
                                <!--<Setter Property="Style" TargetName="OverflowButton" Value="{StaticResource ToolBarVerticalOverflowButtonStyle}"/>-->
                                <Setter Property="Height" TargetName="ToolBarThumb" Value="10"/>
                                <Setter Property="Width" TargetName="ToolBarThumb" Value="Auto"/>
                                <Setter Property="Margin" TargetName="ToolBarThumb" Value="-1,-3,0,0"/>
                                <Setter Property="Padding" TargetName="ToolBarThumb" Value="5,6,6,1"/>
                                <Setter Property="Margin" TargetName="ToolBarHeader" Value="0,0,0,4"/>
                                <Setter Property="Margin" TargetName="PART_ToolBarPanel" Value="1,0,2,2"/>
                                <Setter Property="DockPanel.Dock" TargetName="ToolBarThumb" Value="Top"/>
                                <Setter Property="DockPanel.Dock" TargetName="ToolBarHeader" Value="Top"/>

                                <Setter Property="Margin" TargetName="MainPanelBorder" Value="0,0,0,11"/>
                                <Setter Property="Background" Value="{StaticResource ToolBarVerticalBackground}"/>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Source={x:Static SystemParameters.HighContrast}}" Value="true">
                    <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>

然后尝试工具栏样式

<Grid>
        <ToolBarTray x:Name="ToolTray" Grid.Row="0" Grid.RowSpan="2"   Background="SkyBlue">
            <ToolBar Band="0" BandIndex="0" Style="{DynamicResource ToolBarStyle1}">
                <Button Background="Aqua" Height="25" Width="25" Content="0" />
                <Button Background="BlueViolet" Height="25" Width="25" Content="0" />
                <Button Background="CornflowerBlue" Height="25" Width="25" Content="0"/>
            </ToolBar>
            <ToolBar Band="0" BandIndex="1" Style="{DynamicResource ToolBarStyle1}">
                <Button Background="Aqua" Height="25" Width="25" Content="1"/>
                <Button Background="BlueViolet"  Height="25" Width="25" Content="1"/>
                <Button Background="CornflowerBlue" Height="25" Width="25" Content="1"/>
            </ToolBar>

        </ToolBarTray>
    </Grid>

答案 1 :(得分:-1)

根据Joby的回答,我想出了一个替代方案。希望这可以在以后的某个时间帮助别人。两种方法基本上都做同样的事情,但它们的实现方式不同。根据不同的情况,使用两者中的特定一个可能更合适。

原始答案的关键部分是更改Grid中的Template元素,以使右边距为-3(以抵消3的左边距)。

<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type ToolBar}">
            <Grid x:Name="Grid" Margin="3,1,-3,1" ...
...

在不重新定义整个模板的情况下执行此操作的替代方法是子类ToolBar class:

class MyToolBar : ToolBar
{
    public NoOverflowToolBar()
        : base()
    {
        this.Loaded += MyToolBar_Loaded;
    }

    void MyToolBar_Loaded(object sender, System.Windows.RoutedEventArgs e)
    {
        ToolBar toolBar = sender as ToolBar;
        var grid = toolBar.Template.FindName("Grid", toolBar) as FrameworkElement;
        if (grid != null)
        {
            grid.Margin = new Thickness(3, 1, -3, 1);
        }
    }
}

更新

在编写自定义控件方面有一些经验之后,我意识到没有必要使用Loaded事件来编写它 - 只需使用OnApplyTemplate()覆盖。

public override void OnApplyTemplate()
{
    base.OnApplyTemplate();
    var grid = this.Template.FindName("Grid", this) as FrameworkElement;
    if (grid != null)
    {
        grid.Margin = new Thickness(3, 1, -3, 1);
    }
}