1

我正在学习如何更改 ControlTemplate 并遇到了这篇文章。我复制了 ControlTemplate 并创建了一个 GroupBox。

<UserControl x:Class="MyTestApp.UserControl1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         mc:Ignorable="d" 
         d:DesignHeight="130" d:DesignWidth="250">
<Grid>
    <Grid.Resources>
        <BorderGapMaskConverter x:Key="BorderGapMaskConverter"/>
        <Style x:Key="CheckedGroupBoxStyle" TargetType="{x:Type GroupBox}">
            <Setter Property="BorderBrush" Value="#D5DFE5"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type GroupBox}">
                        <Grid SnapsToDevicePixels="true">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="6"/>
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="6"/>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="6"/>
                            </Grid.ColumnDefinitions>
                            <Border Grid.Column="0" Grid.ColumnSpan="4" Grid.Row="1" Grid.RowSpan="3" Background="{TemplateBinding Background}" BorderBrush="Transparent" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="4"/>
                            <ContentPresenter Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="2"/>
                            <Border Grid.ColumnSpan="4" Grid.Row="1" Grid.RowSpan="3" BorderBrush="White" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="4">
                                <Border.OpacityMask>
                                    <MultiBinding Converter="{StaticResource BorderGapMaskConverter}" ConverterParameter="7">
                                        <Binding Path="ActualWidth" ElementName="Header"/>
                                        <Binding Path="ActualWidth" RelativeSource="{RelativeSource Self}"/>
                                        <Binding Path="ActualHeight" RelativeSource="{RelativeSource Self}"/>
                                    </MultiBinding>
                                </Border.OpacityMask>
                                <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="3">
                                    <Border BorderBrush="White" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="2"/>
                                </Border>
                            </Border>
                            <Border x:Name="Header" Grid.Column="1" Grid.Row="0" Grid.RowSpan="2" Padding="3,1,3,0">
                                <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" ContentSource="Header" RecognizesAccessKey="True"/>
                            </Border>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Grid.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <GroupBox Grid.Row="0" Style="{StaticResource CheckedGroupBoxStyle}">
            <GroupBox.Header>
                <CheckBox>GroupBox1</CheckBox>
            </GroupBox.Header>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <TextBlock Text="Item A" Grid.Column="0" Grid.Row="0" />
                <TextBox Grid.Column="1" Grid.Row="0"></TextBox>

                <TextBlock Text="Item B" Grid.Column="0" Grid.Row="1" />
                <TextBox Grid.Column="1" Grid.Row="1"></TextBox>

                <TextBlock Text="Item C" Grid.Column="0" Grid.Row="2" />
                <TextBox Grid.Column="1" Grid.Row="2"></TextBox>

                <TextBlock Text="Item D" Grid.Column="0" Grid.Row="3" />
                <TextBox Grid.Column="1" Grid.Row="3"></TextBox>
            </Grid>
        </GroupBox>
    </Grid>
</Grid>
</UserControl>

问题是 GroupBox 内的 Grid 周围有一个边框。可以通过将 RowDefinition 的 Height="Auto" 更改为 Height="*" 来删除它。如果我不使用 CheckedGroupBoxStyle,那么边框也不会显示。我想知道为什么,因为上述帖子说生成的样式几乎与控件的默认模板相同。

GroupBox 内网格周围的边框

4

1 回答 1

0

看起来好像您还没有添加BorderGapMaskConverter到您的代码示例中。在 MSDN 上快速搜索后,我发现它实际上Converter是包含在 .NET Framework 中的。您可以在“BorderGapMaskConverter课程”页面上找到它的详细信息。如果您使用的是 .NET 3.0 或更高版本,您将能够使用它。


更新>>>

不抱歉,“实施”不再是正确的词......最初,我认为您必须实施自己的Converter. 但是,现在我发现它包含在 .NET Framework 中,您只需在 XAMLResources部分中添加对它的引用,就像另一篇文章中的示例一样:

<BorderGapMaskConverter x:Key="BorderGapMaskConverter"/>

请注意,您应该在 Visual Studio 错误列表中看到类似以下内容的警告:

无法解析资源“BorderGapMaskConverter”。

于 2013-10-31T12:46:37.200 回答