4

私の WPF アプリケーションを変換するには、Binding オブジェクトを返すマークアップ拡張機能を使用します。これにより、アプリケーションの実行中に言語を切り替えることができます。このマークアップを次のように使用します。

<TextBlock Text="{t:Translate 'My String'}" />"

データ トリガーを使用してボタンのテキストを変更したいと思います。

<Button>
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Template">
                <Setter.Value>
                    <!-- Custom control template, note the TextBlock formating -->
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Grid x:Name="ContentHolder">
                            <ContentPresenter TextBlock.Foreground="Red" TextBlock.FontWeight="Bold" />
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <!-- Custom text triggered by Data Binding... -->
            <Style.Triggers>
                <DataTrigger Binding="{Binding MessageRowButton}" Value="Retry">
                    <Setter Property="Button.Content" Value="{t:Translate Test}" />
                </DataTrigger>
                <DataTrigger Binding="{Binding MessageRowButton}" Value="Acknowledge">
                    <Setter Property="Button.Content" Value="{t:Translate Test}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

これにより、次の例外が発生します。

タイプ 'Setter' の 'Value' プロパティに 'Binding' を設定することはできません。「Binding」は、DependencyObject の DependencyProperty でのみ設定できます。

わかりました、これは私には理にかなっています。Resource で TextBlock を定義{StaticResource MyResource}し、DataTrigger の Setter Value で使用しようとしました。しかし、これを行うと、ボタンのスタイルが正しく適用されません...

ボタン内の文字列のスタイルを設定する機能を損なうことなく、マークアップ拡張機能を使用してボタンのテキストを変更するにはどうすればよいですか?

4

1 に答える 1

7

thisターゲット ( IProvideValueTarget.TargetObject) がセッターの場合は、マークアップ拡張自体 ( ) を返してみてください。スタイルが実際の要素に適用されると再評価されます。

public object ProvideValue(IServiceProvider serviceProvider)
{
    var pvt = service.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
    if (pvt.TargetObject is Setter)
        return this;

    ...
}
于 2011-01-07T09:02:05.867 に答える