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 として使用しました。

ここで、「コントロール」にはない特定のプロパティを使用して、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" /> 

残念ながら、テストでは奇妙な結果が得られました。IsEnabledプロパティは TextBoxes にも設定されていますが、接頭辞はその適用を CheckBoxes、DatePickers、および ComboBoxes に制限する必要があります。

最後に必要だったのは、一部のコントロール コンテンツを変更不可にして、無効なコントロールに関連する読みにくい色を回避することでした。以前の調査から、「無効な」コントロールの色を変更するのは簡単な作業ではなく、コントロール テンプレートの再定義が必要になることがわかりました。そこで IsReadOnly と Background を組み合わせて適用しようと思ったのですが、上記の問題には当てはまりません。実際、CheckBox、DatePicker、および ComboBox は、 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 に答える