裁剪时,WPF ToolBar和StackPanel会自动转换ClipToBounds =“True”

时间:2017-08-02 14:10:25

标签: c# wpf toolbar

我需要在WPF中显示工具栏外部工具栏中的一些子项(工具栏上的按钮会在光标悬停时增长)。

Image 1: Right panel behavior: ClipToBounds="False"

当ClipToBounds =“False”并且所有按钮在工具栏中都有一个位置时,一切都是正确的。当部分面板被窗口边缘裁剪而某些按钮没有位置时会出现问题。在这种情况下,ToolBar和StackPanel自动将ClipToBounds属性切换为“True”并开始裁剪子项。

Image 2: Wrong panel behavior: ClipToBounds snaps to "True"

我可以禁用此行为,或者除了在最顶部的透明容器上绘制按钮之外没办法吗?

2 个答案:

答案 0 :(得分:3)

我的解决方案(只是将工具栏拆分为图层):

<Window x:Class="ZoomBarMockup.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="200" Width="300">

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="30"/>
            <RowDefinition Height="30"/>
            <RowDefinition Height="30"/>
        </Grid.RowDefinitions>

        <Rectangle Grid.Row="0" Fill="#CCC"/>
        <Rectangle Grid.Row="2" Fill="#CCC"/>

        <!-- Decorative toolbar background strip -->
        <Border Grid.Row="1">
            <Border.Background>
                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                    <GradientStop Color="#FFF" Offset="0"/>
                    <GradientStop Color="#DDD" Offset="1"/>
                </LinearGradientBrush>
            </Border.Background>            
        </Border>

        <!-- Wide transparent panel with negative margin -->
        <StackPanel Grid.Row="1" Orientation="Horizontal" ClipToBounds="False"
                    Height="50" Margin="0 -10 0 -10">
            <Ellipse Fill="Orange" Height="50" Width="50" Margin="5 0"/>
            <Ellipse Fill="Orange" Height="50" Width="50" Margin="5 0"/>
            <Ellipse Fill="Orange" Height="50" Width="50" Margin="5 0"/>
            <Ellipse Fill="Orange" Height="50" Width="50" Margin="5 0"/>
            <Ellipse Fill="Orange" Height="50" Width="50" Margin="5 0"/>
        </StackPanel>

    </Grid>
</Window>

答案 1 :(得分:1)

您可以禁用面板的默认裁剪行为。但是为了做到这一点,您必须扩展现有面板之一或实现自己的面板:

class NoClipStackPanel : StackPanel
{
    protected override Geometry GetLayoutClip(Size layoutSlotSize)
    {
        return null;
    }
}

选中this answer,以获取有关不同剪辑方法的更多详细信息。