C# 如何使用VisualState AdaptiveTrigger更改ListView项的大小
我使用视觉状态自适应触发器根据有效屏幕分辨率更改页面外观。这非常有效,但我无法让它用于ListView项 我的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 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>