" Blend可以根据说minWindowWidth
轻松设置视觉状态。但是为TextBlock
元素定义基于状态的样式会非常好,例如tag="header"
,tag="body"
,并让Setter自动更改样式。"
在我最初的问题中,也许我不够明确,让我重新说一下。
我正在调整应用程序窗口的大小,从Landscape到Portrait。我的VisualStateManager具有可根据新的最小宽度调整页面属性的setter。
我有多个TextBlocks(标题,正文等)和其他带有.Text(ToggleSwitch)的控件,我想根据新的宽度自动调整FontSize。
除了在所有状态下通过名称手动设置每个控件之外,还有一种方法可以让VisualStateManager自动为每个'类型'文本(正文/标题/等)?我目前的工作是为每个.Text控件DataBind一个Style,让ViewModel完成所有缩放。这是有效的,但这确实是Blend的用途,对吧?所以我一定错过了每个人都在使用的明显方式。
感谢迄今为止的所有好评。
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="VisualStateGroup">
<VisualState x:Name="PhonePortrait">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="{StaticResource NarrowMinWidth}"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="SwitchStackPanel.(StackPanel.Orientation)" Value="Vertical"/>
<!-- Setter to change all Body textblocks to FontSize=8-->
<!-- Setter to change all Header textblocks to FontSize=10-->
<!-- Setter to change all ToggleSwitch.Text to FontSize=8-->
<!-- etc..-->
答案 0 :(得分:1)
您可以使用全局样式。这利用了基于Tag
的触发器。
<Style TargetType="{x:Type TextBlock}">
<!--Default Setters Here-->
<Setter Property="Background" Value="White"/>
<Style.Triggers>
<Trigger Property="Tag" Value="body">
<Setter Property="Background" Value="Gray"/>
<!--Insert desired state setters here-->
</Trigger>
<Trigger Property="Tag" Value="header">
<Setter Property="Background" Value="DarkGray"/>
<!--Insert desired state setters here-->
</Trigger>
</Style.Triggers>
</Style>
然后,您可以拥有默认状态,并且触发的setter只会在附加适用标记时影响Textblock。
如果您已有其他样式或想要进行选择过程,则可能需要添加密钥,然后在样式中使用BasedOn
。