1

再会,

我正在为 WPF 应用程序中的 CheckBox 控件设置样式。我的目标是在 CheckBox“默认”矩形/边框的左侧添加一个填充。

默认情况下,填充仅应用于 CheckBox 的内容区域。Margin 确实在左侧起作用,但在这种情况下,CheckBox 不会注册单击以选中该框。

有人有想法吗?提前致谢!!

编辑#1,作为对 Vlad 的回答,一个显示填充/边距差异的示例:

<StackPanel Orientation="Vertical">
   <Border Width="400" Height="50" BorderBrush="Black" BorderThickness="1">
      <CheckBox Content="Normal, clickable everywhere" />
   </Border>
   <Border Width="400" Height="50" BorderBrush="Black" BorderThickness="1">
      <CheckBox Content="Content padding, clickable everywhere" Padding="5" />
   </Border>
   <Border Width="400" Height="50" BorderBrush="Black" BorderThickness="1">
      <CheckBox Content="Control margin, not clickable in area 5px around" Margin="5" />
   </Border>
</StackPanel>
4

2 回答 2

3

好吧,预计它会以这种方式运行。边距被认为是控件的“外部”,因此边距区域不会让点击进入控件。相反,填充区域被认为是控件的一部分(在控件本身和呈现内容的“客户区”之间),因此填充区域正在获得点击。

看起来你可以只用Padding="5,0,0,0". (这只会在左侧添加填充。)请参阅这张关于 WPF 盒子模型的图片。


更新:根据您的评论,您需要破解默认模板。默认模板可以在这里找到:http: //msdn.microsoft.com/en-us/library/ms752319%28v=vs.100%29.aspx

您需要进行以下更改:将 包含BulletDecoratorGrid中,并将所需的边距设置为BulletDecorator. 这一定会有所帮助,因为希望重点将应用于整体Grid而不是BulletDecorator. 或者,或者,您可以将边距设置为BulletDecorator.Bullet's Border


更新:当然最好不要将整个模板定义复制到实际代码中以提高可维护性。可以通过以下技巧避免。

假设您决定在Bullet's设置额外的边距Border。您可以尝试Border Checkbox'sBullet中覆盖默认样式。以下技巧应该做到这一点:

<!-- first, define a style for border -->
<Style TargetType="Border" x:Key="MyCoolBorderWithMargin">
    <Setter Property="Margin" Value="5,0,0,0"/>
</Style>

<!-- then, define a style for BulletDecorator -->
<!-- this style overrides the style for inner borders -->
<Style TargetType="BulletDecorator" x:Key="MyCoolDecoratorStyle">
    <Style.Resources>
        <Style TargetType="Border"
               BasedOn="{StaticResource MyCoolBorderWithMargin}"/>
    </Style.Resources>
</Style>

<!-- finally, override the style for CheckBox -->
<Style TargetType="CheckBox">
    <Style.Resources>
        <Style TargetType="BulletDecorator"
               BasedOn="{StaticResource MyCoolDecoratorStyle}"/>
    </Style.Resources>
</Style>

这应该会有所帮助。

Beware that this code is a hack, using the knowledge about how the default control template for CheckBox is implemented in the current WPF version. (If you are using WPF version different from 4.0, you may need to update the code, as it's version-specific: different versions of WPF use different control templates!)

于 2012-07-04T11:05:00.160 回答
0

听起来您正在寻找Margin而不是Padding。你找到文档了吗?我认为它给出了相当彻底的解释。

仅在左侧添加空格的复选框:

<CheckBox Margin="50 0 0 0"/>
于 2012-07-04T09:36:35.460 回答