根据视觉状态更改样式

时间:2016-07-05 16:40:22

标签: wpf xaml uwp visualstatemanager

" 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..-->

1 个答案:

答案 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