VisualStateManager 在 Button.ContentTemplate UWP 中不工作
VisualStateManager not working inside Button.ContentTemplate UWP
我已经为此苦苦挣扎了几天,现在经过大量努力仍无法找到解决方案。这是我面临问题的代码。所以我有一个 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”,用于将任何控件转换为“PointerOver”视觉状态,但通常一些代码隐藏更简单。
我已经为此苦苦挣扎了几天,现在经过大量努力仍无法找到解决方案。这是我面临问题的代码。所以我有一个 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”,用于将任何控件转换为“PointerOver”视觉状态,但通常一些代码隐藏更简单。