1

我有这个命名风格

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

我将它广泛用于 TextBoxes、ComboBoxes、DatePickers 等,因此我将所有这些元素的超类 Control 用作 TargetType。

现在我想使用“Control”没有的特定属性来区分 dataTrigger 内的设置器。似乎我必须创建具有不同名称的不同样式,每个样式用于我想要区分的每个 targetType,但这样我必须更改使用它的所有元素中的样式名称。有没有更聪明的方法来实现这个目标?我不想去修改我拥有的每个 xaml 文件。

第一次回答后更新

我试图将以下设置器放入数据触发器中:

<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" /> 

不幸的是,测试给出了奇怪的结果。尽管前缀应将其应用程序限制为 CheckBoxes、DatePickers 和 ComboBoxes,但也为 TextBoxes 设置了IsEnabled属性。

我的最终需要是使某些控件内容不可更改,避免与禁用控件相关的难以阅读的颜色。从以前的研究中,我了解到更改“禁用”控件的颜色并不是一件容易的事,并且涉及到控件模板的重新定义。所以我想应用 IsReadOnly 和 Background 的组合,但它不适用于上述问题。事实上,CheckBoxes、DatePickers 和 ComboBoxes 只能使用IsEnabled属性使其不可更改。我错过了什么吗?

4

1 回答 1

0

有办法,但我必须警告你——这远非最佳实践,应该避免

WPF 允许您使用所需的类型作为属性的前缀。这样,如果您将样式应用于不从前缀类型继承的控件 - 设置器将被忽略。

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

[对此进行广泛测试,因为我怀疑它可能会造成内存泄漏。]

于 2013-01-10T21:11:38.043 回答