我正在尝试做类似的事情:
<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,但上面的例子简化了问题。有什么想法吗?
答案 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