web-dev-qa-db-ja.com

ボタンのコンテンツをスタイルで変更しますか?

私はこれに似た何かをしようとしています:

<Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml">

    <Grid>
        <Button>
            <Button.Style>
                <Style TargetType="{x:Type Button}">
                    <Setter Property="Content"
                            Value="No mouse over" />
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver"
                                 Value="True">
                            <Setter Property="Content">
                                <Setter.Value>
                                    <CheckBox Content="Mouse is over" />
                                </Setter.Value>
                            </Setter>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>
        </Button>
    </Grid>
</Window>

ただし、次のメッセージを含む実行時XamlParseExceptionが発生します。

タイプ「System.Windows.Controls.CheckBox」のコンテンツをタイプ「System.Object」のオブジェクトに追加できません。オブジェクトのエラー 'System.Windows.Controls.CheckBox

私は実際に、外部条件に応じてボタンのコンテンツに異なるアイコンを描画しようとしています。したがって、実際にDataTriggerを使用しようとしていますが、上記の例では問題が単純化されています。何か案は?

17
Thrash505

VisualsをSetter値として直接設定できないため、実際のエラーが発生しています。ただし、DataTemplateを使用してContentTemplateを設定するか、ボタンに固有または他の場所にあるリソースとしてコンテンツを作成することにより、探している動作を取得できます。

<Button>
    <Button.Resources>
        <CheckBox x:Key="Local_MouseOverContent" Content="Mouse is over" />
    </Button.Resources>
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Content" Value="No mouse over" />
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Content"
                            Value="{StaticResource Local_MouseOverContent}" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

<Button>
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Content" Value="No mouse over" />
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate DataType="Button">
                                <CheckBox Content="Mouse is over" />
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>
39
rmoore

リマーク!まさにあなたの例は。NET Framework 4で何の変更もなしに機能します!!!!

  <Button>
        <Button.Style>
            <Style TargetType="{x:Type Button}">
                <Setter Property="Content"
                        Value="No mouse over" />
                <Style.Triggers>
                    <Trigger Property="IsMouseOver"
                             Value="True">
                        <Setter Property="Content">
                            <Setter.Value>
                                <CheckBox Content="Mouse is over" />
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>
6
Rudolf

アプリ全体のボタンで使用される一般的なスタイルを作成している場合、画像がリソースであるアプローチを使用すると、視覚的なツリーの競合が発生します。したがって、その場合はテンプレートが唯一の選択肢です。

2
Steve