3

列挙に基づいて同様の色付け規則に従う必要がある2種類のテキストがあります。

 public enum Modes
 {
   A,
   B,
   C
 }

マークアップ付きのスタイルDataTriggerは、色付けに使用されます。

      <Style TargetType="SEE BELOW" x:Key="Coloring">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=.}" Value="A">
                    <Setter Property="Foreground" Value="Red" />
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=.}" Value="B">
                    <Setter Property="Foreground" Value="Green" />
                </DataTrigger>
               <DataTrigger Binding="{Binding Path=.}" Value="C">
                    <Setter Property="Foreground" Value="Blue" />
                </DataTrigger>
            </Style.Triggers>
        </Style>

1つの使用シナリオはSystem.Windows.Documents.Hyperlink、ネストされたSystem.Windows.Controls.TextBlock

<Hyperlink><TextBlock/></Hyperlink>

もう1つは単純TextBlockです:

<TextBlock Style="{StaticResource Coloring}" Text="yada"/>

もちろん、両方のTextBlock要素のスタイルを設定できます。

<TextBlock Style="{StaticResource Coloring}" Text="yada"/>
<Hyperlink><TextBlock Style="{StaticResource Coloring}"/></Hyperlink>

しかし、それではハイパーリンクケースの下線のスタイルを設定できません。

両方のタイプでスタイルを設定しようとすると、次のようになります。

<TextBlock Style="{StaticResource Coloring}" Text="yada"/>
<Hyperlink Style="{StaticResource Coloring}"><TextBlock/></Hyperlink>

TargetType次に、スタイルの属性で使用する共通の祖先タイプが(明らかに)ないため、スタイリングは失敗します。

これは最終的には構成可能なものであると想定されているため、目標は、これらのテキストブロックのカラーマッピングへのモードを定義するXAMLドキュメントを作成することです。したがって、同じマッピングを定義する2つの冗長なスタイル(1つはハイパーリンク用、もう1つはTextBlock用)を使用するのは気が進まない。

だから...質問:冗長なスタイルXAMLブロックなしで両方のケースを一貫してスタイル設定するにはどうすればよいですか?

4

2 に答える 2

6

次のように、ハイパーリンクをスタイル自体にバインドすることで、ハイパーリンクを親のTextBlockと同じ前景色にすることができます。

<Style TargetType="TextBlock" x:Key="Coloring">
        <Style.Resources>
            <Style TargetType="Hyperlink">
                <Setter Property="Foreground" Value="{Binding Foreground,RelativeSource={RelativeSource FindAncestor,AncestorType=TextBlock}}"/>
            </Style>
        </Style.Resources>
            <Setter Property="Foreground" Value="Orange"/>
        <Style.Triggers>
        <DataTrigger Binding="{Binding Path=.}" Value="A">
            <Setter Property="Foreground" Value="Red" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=.}" Value="B">
            <Setter Property="Foreground" Value="Green" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=.}" Value="C">
            <Setter Property="Foreground" Value="Blue" />
        </DataTrigger>
    </Style.Triggers>
</Style>

この例では、テスト目的で、デフォルトの前景をオレンジにするセッターを追加しました。

于 2010-02-11T22:06:06.020 に答える
0

投稿した後、私は別のアプローチに気づきました。ネストされたTextBlockシナリオでハイパーリンクを強制していました。ハイパーリンクをTextBlockでラップする場合:

<TextBlock Style="{StaticResource Coloring}"><Hyperlink><TextBlock/></HyperLink></TextBlock>

次に、両方のケースがTextBlockスタイルに崩壊します。(上記のソリューションと組み合わせて)

于 2010-02-11T22:08:07.707 に答える