2012-07-04 31 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左側缺少可點擊區域的工作直觀。 –