更改样式中按钮的内容?

时间:2009-06-26 19:12:03

标签: c# wpf xaml data-binding 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>

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

  

无法添加类型的内容   'System.Windows.Controls.CheckBox'来   “System.Object”类型的对象。   对象出错   “System.Windows.Controls.CheckBox

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

4 个答案:

答案 0 :(得分: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>

答案 1 :(得分:6)

REMARK!确切地说,您的示例适用于 .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>

答案 2 :(得分:2)

如果要在应用程序周围使用按钮使用通用样式,则会使用图像为资源的方法获得可视树冲突。因此,在这种情况下,模板是您唯一的选择。

答案 3 :(得分:-2)

警告:这可能不是最好或最正确的方法。请务必阅读此页面上的其他答案。

非常确定你想在这种情况下使用控件模板。类似的东西:


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

在触发器中添加控件模板以进行悬停。

这是一个很好的link