C# 如何使用VisualState AdaptiveTrigger更改ListView项的大小

C# 如何使用VisualState AdaptiveTrigger更改ListView项的大小,c#,xaml,uwp,windows-10-universal,C#,Xaml,Uwp,Windows 10 Universal,我使用视觉状态自适应触发器根据有效屏幕分辨率更改页面外观。这非常有效,但我无法让它用于ListView项 我的ListView如下所示: <ListView x:Name="listView" > <ListView.ItemTemplate> <DataTemplate> <TextBlock FontSize="20" Text="{Binding MyItem}"/> &

我使用视觉状态自适应触发器根据有效屏幕分辨率更改页面外观。这非常有效,但我无法让它用于ListView项

我的ListView如下所示:

<ListView x:Name="listView" >
    <ListView.ItemTemplate>
        <DataTemplate>
                <TextBlock FontSize="20" Text="{Binding MyItem}"/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

我可以在XAML中静态更改文本块字体大小。但我不知道如何在VisualState setter target中引用此内容。作为自动生成的子项,我不能给TextBlock命名。我的视觉状态代码如下。我放了???我想在其中引用ListView TextBlock项FontSize

 <VisualStateManager.VisualStateGroups>
    <VisualStateGroup>
            <VisualState x:Name="NormalStateReadView">
                    <!-- VisualState to be triggered when window width is <720 effective pixels -->
                    <VisualState.StateTriggers>
                        <AdaptiveTrigger MinWindowWidth="0" />
                    </VisualState.StateTriggers>
                    <VisualState.Setters>
                        <Setter Target="???" Value="20" />
                    </VisualState.Setters>
                </VisualState>
    </VisualStateGroup>

    <VisualStateGroup>
            <VisualState x:Name="NormalStateReadView">
                    <!-- VisualState to be triggered when window width is >=720 effective pixels -->
                    <VisualState.StateTriggers>
                        <AdaptiveTrigger MinWindowWidth="720" />
                    </VisualState.StateTriggers>
                    <VisualState.Setters>
                        <Setter Target="???" Value="30" />
                    </VisualState.Setters>
                </VisualState>
    </VisualStateGroup>


非常感谢您的帮助。

我们不能将
AdaptiveTrigger
用于
数据模板中的元素。你应该习惯这样做。这可能对你有帮助。如果你想要一个新的视频,那么这个视频可能会帮助你。但我有一个小的解决办法

这是我的方法:

<VisualStateManager.VisualStateGroups>
    <VisualStateGroup>
        <VisualState x:Name="NormalStateReadView">
            <!-- VisualState to be triggered when window width is <720 effective pixels -->
            <VisualState.StateTriggers>
                <AdaptiveTrigger MinWindowWidth="0" />
            </VisualState.StateTriggers>
            <VisualState.Setters>
                <Setter Target="SetFontSize.FontSize" Value="20" />
            </VisualState.Setters>
        </VisualState>
    </VisualStateGroup>

    <VisualStateGroup>
        <VisualState x:Name="WideStateReadView">
            <!-- VisualState to be triggered when window width is >=720 effective pixels -->
            <VisualState.StateTriggers>
                <AdaptiveTrigger MinWindowWidth="720" />
            </VisualState.StateTriggers>
            <VisualState.Setters>
                <Setter Target="SetFontSize.FontSize" Value="30" />
            </VisualState.Setters>
        </VisualState>
    </VisualStateGroup>
</VisualStateManager.VisualStateGroups>

<TextBlock Name="SetFontSize" Visibility="Collapsed"/>
<ListView x:Name="listView">
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextBlock FontSize="{Binding Path=FontSize, ElementName=SetFontSize}" Text="{Binding MyItem}"/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
  • DataTemplate
    外部创建
    TextBlock
    ,并设置
    Visibility=“Collapsed”

  • 使用
    AdaptiveTrigger
    更改此
    TextBlock的
    FontSize

    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup>
            <VisualState x:Name="NormalStateReadView">
                <VisualState.StateTriggers>
                    <AdaptiveTrigger MinWindowWidth="0" />
                </VisualState.StateTriggers>
                <VisualState.Setters>
                    <Setter Target="SetFontSize.FontSize" Value="20" />
                </VisualState.Setters>
            </VisualState>
        </VisualStateGroup>
    
        <VisualStateGroup>
            <VisualState x:Name="WideStateReadView">
                <VisualState.StateTriggers>
                    <AdaptiveTrigger MinWindowWidth="720" />
                </VisualState.StateTriggers>
                <VisualState.Setters>
                    <Setter Target="SetFontSize.FontSize" Value="30" />
                </VisualState.Setters>
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
    
    <TextBlock FontSize="{Binding Path=FontSize, ElementName=SetFontSize}"/>
    
  • 这是您的代码:

    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup>
            <VisualState x:Name="NormalStateReadView">
                <!-- VisualState to be triggered when window width is <720 effective pixels -->
                <VisualState.StateTriggers>
                    <AdaptiveTrigger MinWindowWidth="0" />
                </VisualState.StateTriggers>
                <VisualState.Setters>
                    <Setter Target="SetFontSize.FontSize" Value="20" />
                </VisualState.Setters>
            </VisualState>
        </VisualStateGroup>
    
        <VisualStateGroup>
            <VisualState x:Name="WideStateReadView">
                <!-- VisualState to be triggered when window width is >=720 effective pixels -->
                <VisualState.StateTriggers>
                    <AdaptiveTrigger MinWindowWidth="720" />
                </VisualState.StateTriggers>
                <VisualState.Setters>
                    <Setter Target="SetFontSize.FontSize" Value="30" />
                </VisualState.Setters>
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
    
    <TextBlock Name="SetFontSize" Visibility="Collapsed"/>
    <ListView x:Name="listView">
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock FontSize="{Binding Path=FontSize, ElementName=SetFontSize}" Text="{Binding MyItem}"/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
    

    您需要将模板包装在
    用户控件中,自适应触发器才能工作;此外,视觉状态也应进入模板内部,并确保它位于
    用户控件的第一个直接子项(即
    网格
    )下。我知道您已经定义了两个可视状态组,但实际上您只需要一个

    <ListView.ItemTemplate>
        <DataTemplate>
            <UserControl>
                <Grid>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup>
                            <VisualState x:Name="NarrowState">
                                <VisualState.StateTriggers>
                                    <AdaptiveTrigger MinWindowWidth="0" />
                                </VisualState.StateTriggers>
    
                                <VisualState.Setters>
                                    <Setter Target="Title.(TextBlock.FontSize)" Value="24" />
                                </VisualState.Setters>
                            </VisualState>
    
                            <VisualState x:Name="WideState">
                                <VisualState.StateTriggers>
                                    <AdaptiveTrigger MinWindowWidth="720" />
                                </VisualState.StateTriggers>
    
                                <VisualState.Setters>
                                    <Setter Target="Title.(TextBlock.FontSize)" Value="36" />
                                </VisualState.Setters>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
    
                    <TextBlock x:Name="Title" Text="{Binding Property1}" />
                </Grid>
            </UserControl>
        </DataTemplate>
    </ListView.ItemTemplate>
    

    工作演示



    请随意查看一个工作示例。

    我可以在Grid中设置TextBlock的字体大小,这是一个非常漂亮和优雅的解决方案。非常感谢!我不得不说,这让我觉得有点不舒服但是我尊重OP给出的理由。@JustinXL我喜欢首先使用所有VisualStateManager。但是如果您需要修改的不仅仅是字体大小,该怎么办?我想我们都需要一个更好的解决方案。@JustinXL我们可以通过
    AdaptiveTrigger
    修改
    ResourceDictionary
    吗?您好,谢谢。我接受了第一个解决方案。我更喜欢为页面定义视觉状态,并在一个地方调整所有内容的大小
    <ListView.ItemTemplate>
        <DataTemplate>
            <UserControl>
                <Grid>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup>
                            <VisualState x:Name="NarrowState">
                                <VisualState.StateTriggers>
                                    <AdaptiveTrigger MinWindowWidth="0" />
                                </VisualState.StateTriggers>
    
                                <VisualState.Setters>
                                    <Setter Target="Title.(TextBlock.FontSize)" Value="24" />
                                </VisualState.Setters>
                            </VisualState>
    
                            <VisualState x:Name="WideState">
                                <VisualState.StateTriggers>
                                    <AdaptiveTrigger MinWindowWidth="720" />
                                </VisualState.StateTriggers>
    
                                <VisualState.Setters>
                                    <Setter Target="Title.(TextBlock.FontSize)" Value="36" />
                                </VisualState.Setters>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
    
                    <TextBlock x:Name="Title" Text="{Binding Property1}" />
                </Grid>
            </UserControl>
        </DataTemplate>
    </ListView.ItemTemplate>
    
    <DataTemplate>
        <UserControl>
            <Interactivity:Interaction.Behaviors>
                <local:VisualStateInTemplateBehavior ParentVisualStateGroup="{Binding ElementName=AdaptiveVisualStates}">
                    <local:VisualStateInTemplateBehavior.NarrowState>
                        <VisualState x:Name="Narrow">
                            <VisualState.Setters>
                                <Setter Target="Title.(TextBlock.FontSize)" Value="24" />
                            </VisualState.Setters>
                        </VisualState>
                    </local:VisualStateInTemplateBehavior.NarrowState>
    
                    <local:VisualStateInTemplateBehavior.NormalState>
                        <VisualState x:Name="Normal">
                            <VisualState.Setters>
                                <Setter Target="Title.(TextBlock.FontSize)" Value="32" />
                            </VisualState.Setters>
                        </VisualState>
                    </local:VisualStateInTemplateBehavior.NormalState>
    
                    <local:VisualStateInTemplateBehavior.WideState>
                        <VisualState x:Name="Wide">
                            <VisualState.Setters>
                                <Setter Target="Title.(TextBlock.FontSize)" Value="40" />
                            </VisualState.Setters>
                        </VisualState>
                    </local:VisualStateInTemplateBehavior.WideState>
                </local:VisualStateInTemplateBehavior>
            </Interactivity:Interaction.Behaviors>