2013-01-09 19 views
1

我有這樣的命名風格如何根據targetTypes修改具有不同setter的傳統命名樣式?

<Style x:Key="validationSupport" TargetType="{x:Type Control}"> 
    <Setter Property="Margin" Value="5,2,14,2" /> 
    ...OMISSIS... 
    <Style.Triggers> 
     ...OMISSIS... 
     <DataTrigger Binding="{Binding DataContext.ActiveWorkspace.Editable, RelativeSource={RelativeSource AncestorType=Window}}" Value="False"> 
      <Setter Property="IsEnabled" Value="False" /> 
     </DataTrigger> 
    </Style.Triggers> 

</Style> 

我用它廣泛用於文本框,組合框,DatePickers等,所以我使用的TargetType超類所有這些元素,控制。

現在我想使用'Control'沒有的特定屬性來區分dataTrigger中的setter。似乎我必須用不同的名稱創建不同的樣式,每個樣式都需要區分每個targetType,但這樣我就必須在所有使用它的元素中更改樣式名稱。有沒有更聰明的方法來實現這一目標?我不想要去修改我擁有的每個xaml文件。第一個答案後

更新

我試圖把下面的制定者的datatrigger內:

<Setter Property="Background" Value="#FFECECF8" /> 
<Setter Property="CheckBox.IsEnabled" Value="False" /> 
<Setter Property="DatePicker.IsEnabled" Value="False" /> 
<Setter Property="ComboBox.IsEnabled" Value="False" /> 
<Setter Property="TextBox.IsReadOnly" Value="True" /> 

不幸的是,測試了奇怪的結果。 IsEnabled屬性也設置爲TextBoxes,儘管前綴應限制其應用程序CheckBoxes,DatePickers和ComboBoxes。

我最終的需求是讓一些控件內容不可更改,避免難以閱讀與禁用控件相關的顏色。從以前的研究中我瞭解到,改變「禁用」控件的顏色並不是一件容易的事,並且涉及控制模板的重新定義。所以我想應用IsReadOnly和Background的組合,但它不適用於上述問題。事實上,只有使用IsEnabled屬性才能使CheckBoxes,DatePickers和ComboBoxes不可更改。 我錯過了什麼嗎?

回答

0

有一個辦法,但我不得不提醒你 - 這遠非最佳實踐,應該儘量避免

WPF允許你使用所需類型的屬性前綴。這樣,如果將樣式應用於不從前綴類型繼承的控件 - 則忽略setter。

<Style x:Key="validationSupport" TargetType="{x:Type Control}"> 
    <Setter Property="Margin" Value="5,2,14,2" /> 
    ...OMISSIS... 
    <Style.Triggers> 
     ...OMISSIS... 
     <DataTrigger Binding="{Binding DataContext.ActiveWorkspace.Editable, RelativeSource={RelativeSource AncestorType=Window}}" Value="False"> 
      <Setter Property="IsEnabled" Value="False" /> 
      <Setter Property="Button.Background" Value="Red" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

[廣泛測試這一點,因爲我懷疑它可能會造成內存泄漏。]

+0

的解決方案看起來很簡單,我不能看到它應避免任何理由。你能澄清這一點嗎? – Filippo

+0

首先,你有一個針對目標類型X的風格,它在目標類型Y上執行任何操作。只要它只是一種風格就可以管理,但是你可以很快發現自己正在爲其他風格執行操作,並且在幾個月內它變成了難以控制的混亂('爲什麼ListBoxItem的邊距改變?!')。其次,我不確定它不會泄漏內存 - 正如我所說的,這需要測試。 – XAMeLi

相關問題