更改样式中按钮的内容?

Thr*_*505 17 c# data-binding wpf xaml styles

我正在尝试做类似这样的事情:

<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>
Run Code Online (Sandbox Code Playgroud)

但是,我得到一个运行时XamlParseException,其消息为:

无法将"System.Windows.Controls.CheckBox"类型的内容添加到"System.Object"类型的对象中.对象'System.Windows.Controls.CheckBox出错

我实际上是在尝试根据外部条件为按钮的内容绘制不同的图标.所以我实际上是在尝试使用DataTrigger,但上面的例子简化了问题.有任何想法吗?

rmo*_*ore 39

发生实际错误是因为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>
Run Code Online (Sandbox Code Playgroud)


小智 6

备注!确切地说,您的示例适用于.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>
Run Code Online (Sandbox Code Playgroud)


apa*_*dit -1

警告:这可能不是最好或正确的方法。请确保您也阅读了本页上的其他答案。

很肯定您会想在这种情况下使用控件模板。就像是:


<style>
    <Setter Property="Content">
        <Setter.Value>
            <ControlTemplate>
                <Image Img="something.jpg" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</style>

并在悬停触发器中添加一个控制模板。

这是一个很好的链接

  • 正如摩尔所说,这是行不通的。您需要将 ContentTemplate 属性设置为 DataTemplate。 (3认同)
  • 抱歉,我投票否决了你,但现在我不能收回它了。我已经阅读了您指出的文章,并且确实奇怪的是,ControlTemplate 可以设置为基于该文章的控件的内容。另外,您明确表示这可能不是最佳解决方案。 (2认同)