我已经为此挣扎了几天了,现在无法找到解决方案。这是我面对问题的代码。所以我有一个ItemsControl
,每个元素都是Button
,每个Button
都有Image
和TextBlock
。悬停在Button
上,我可以看到Button
的Background
按预期更改为Red
。但是我无法将TextBlock
的Foreground
更改为Green
。在这方面的任何帮助都是非常感谢的。
<ControlTemplate x:Key="ButtonTemplate" TargetType="ContentControl">
<Grid Background="Transparent" x:Name="Mini">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="PointerOver">
<VisualState.Setters>
<Setter Target="Mini.Background" Value="Red" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<ContentPresenter x:Name="MiniContent" />
</Grid>
</ControlTemplate>
<DataTemplate x:Key="ListItemTemplate" x:DataType="local:DataModel">
<Button
Template="{StaticResource ButtonTemplate}">
<Button.ContentTemplate>
<DataTemplate x:DataType="local:DataModel">
<UserControl>
<Grid >
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="PointerOver">
<VisualState.Setters>
<Setter Target="Value.Foreground" Value="Green" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<TextBlock x:Name="Value"
Foreground="Yellow"
Text="{x:Bind DisplayName, Mode=OneWay}"/>
<Image
Width="16"
Source="{x:Bind ImageBitmap, Mode=OneWay}"/>
</Grid>
</UserControl>
</DataTemplate>
</Button.ContentTemplate>
</Button>
</DataTemplate>
<ItemsControl
ItemTemplate="{StaticResource ListItemTemplate}"
ItemsSource="{x:Bind DataModelVector, Mode=OneWay}" />
您需要在VisualStates之间进行实际转换,PointerOver状态不会自动触发。最简单的方法是将DataTemplate的内容分解到它自己的文件中(带有标记和代码隐藏的UserControl),并在代码中处理指针事件,使用VisualStateManager.GoToState在可视化状态之间转换。
你也可以创建一个可重用的"StateTrigger"用于将任何控件转换为"指针指向"。可视化状态,但通常一些代码隐藏更简单。