您需要将模板包装在UserControl
让自适应触发器发挥作用;视觉状态也应该进入模板内部,并确保它位于第一个直接子级下(即Grid
) 的UserControl
。我看到您定义了两个视觉状态组,但实际上您只需要一个。
<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>
Update
这是我认为更灵活的解决方案。它需要一些代码来设置,但结果是您获得干净、可重用且可读的代码。
这个想法是为了获得顶层的参考VisualStateGroup
其定义为outside of the ListView
,主要是在Page
level.
然后,创建三个VisualState
s (i.e. Narrow, Normal & Wide)并将它们附加到新的VisualStateGroup
它应该属于第一个孩子UserControl
.
一旦我们引用了这两个VisualStateGroup
s,我们可以监控顶级的CurrentStateChanged
并相应地更新第二个中的状态。
上面的所有逻辑都可以用一个Behavior
来自UWP XAML 行为 nuget 包.
一旦Behavior在适当的地方,你可以简单地定义你的内心状态:
<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>
工作演示
请随意查看工作示例here.