2012-07-04 25 views
1

美好的一天,如何向WPF CheckBox控件添加左填充?

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

默认情况下,填充仅应用于CheckBox的内容区域。保证金在左侧工作,但在这种情况下,CheckBox不会注册点击以检查框。

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

编辑#1,在回答弗拉德,这表明在填充/保证金的区别的例子:

<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> 
+0

我理解正确吗,CheckBox' _withwith margin与_without_有不同的方式吗?你可以发布(最小)代码重现吗? – Vlad

+0

好的,快来! –

+0

@Vlad,让我的帖子被一个例子编辑。希望很清楚。 –

回答

2

那么,它预计到这样的行为。保证金被认为是控制的“外部”,因此保证金范围不会让点击通过控制。相反,填充区域被认为是控制的一部分(在控件本身和其呈现内容的“客户区域”之间),所以填充区域正在获得点击。

看起来你可以只用Padding="5,0,0,0"。 (这只会在左侧添加填充。)有关WPF的框模型,请参见this picture


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

您需要进行以下更改:将BulletDecorator包含到Grid中,并将所需的边距设置为BulletDecorator。这必须有所帮助,因为希望重点将适用于整个Grid而不是BulletDecorator。或者,您也可以在BulletDecorator.BulletBorder处设置保证金。


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

假设您已决定在BulletBorder处设置额外保证金。您可以尝试覆盖Border的默认样式,只需在CheckboxBullet之内。以下技巧应该这样做:

<!-- 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> 

这应该有所帮助。

请注意,此代码是黑客,使用有关如何在当前WPF版本中实现CheckBox的默认控制模板的知识。 (如果您使用的是不同于4的WPF版本。0,您可能需要更新代码,因为它的版本特定:不同版本的WPF使用不同的控制模板!)

+0

谢谢,我了解设计的行为。不幸的是,CheckBox控件上的填充仅适用于内容区域。内容区域始终位于可点击矩形的右侧。所以这是不幸的解决方案... –

+0

@Monty:好吧,看看更新的答案中的第二种方法。 – Vlad

+0

好的,这是一个镜头!剩下的一个问题是,我可以在BulletDecorator(或Border)上设置边距而不将整个控制模板复制到我的代码中? –

0

这听起来像你正在寻找Margin,而不是Padding。你有没有找到the documentation?我认为它给了一个相当彻底的解释。

复选框上只有左侧添加空格:

<CheckBox Margin="50 0 0 0"/> 
+0

检查我的帖子,我提到它没有注册点击检查边缘区域中的CheckBox。同时更新后的示例显示了这一点。不幸的是不是解决方案 –

+0

@Monty:“CheckBox”不在边缘区域注册点击的原因是因为它不是控件的一部分。这可以改变,但我会认为它的糟糕的界面设计。你确定你想要这样做吗? – Mizipzor

+0

mizipzor,在这种情况下是的。我只展示了我的UI的一部分,CheckBox是一个样式化的ListBox的一部分。因此,CheckBox左侧缺少可点击区域的工作直观。 –