VisualStateManager 在 Button.ContentTemplate UWP 中不工作

VisualStateManager not working inside Button.ContentTemplate UWP

我已经为此苦苦挣扎了几天,现在经过大量努力仍无法找到解决方案。这是我面临问题的代码。所以我有一个 ItemsControl,其中每个元素都是 Button,每个 Button 都有一个 ImageTextBlock。将鼠标悬停在 Button 上时,我可以看到 ButtonBackground 按预期更改为 Red。但是我无法将 TextBlockForeground 更改为 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”视觉状态,但通常一些代码隐藏更简单。