自适应触发器上的UWP加载样式

本文关键字:加载 样式 UWP 触发器 自适应 | 更新日期: 2023-09-27 17:59:09

在试图了解一些关于s的知识时,我陷入了一个特定的主题。我希望我的按钮在大小和对齐方式上使用我预先制作的样式进行编辑。一个例子:

         <Button Style="{StaticResource ButtonFormat}">
        </Button>

按钮有一个保存在应用程序中的样式。Xaml样式是这样写的:

 <Application.Resources>
    <Style TargetType="Button" x:Key="ButtonFormat">
        <Setter Property="Background" Value="#FF6E1400" />
        <Setter Property="Margin" Value="5,5,5,5" /> 
    </Style>
 <Application.Resources> 

现在,我的困境是:

我想加载另一个覆盖"按钮格式"的样式。我一直在尝试在VisualStatemanager中进行实验,试图想出正确的方法来做到这一点,但我真的找不到任何能充分解释我如何做到的东西。

因此,在以下可视化状态下:

  <VisualState x:Name="BigView" >
                <VisualState.StateTriggers>
                    <AdaptiveTrigger MinWindowWidth="550" />
                </VisualState.StateTriggers>
                <VisualState.Setters>
                    <!--stuff goes here-->
                    <!--stuff goes here-->
                </VisualState.Setters>
            </VisualState>

我想用ButtonFormatBlue重写ButtonFormat,如下所示:

        <Style TargetType="Button" x:Key="ButtonFormatBlue ">
        <Setter Property="Background" Value="Blue" />
        <Setter Property="Margin" Value="5,5,5,5" />
    </Style>

我看到有人建议使用C#而不是visualstatemanager,但我没有正确理解这个描述,是否可以根据我的意愿从visualstatetrigger加载它,或者我看错了方向?

感谢所有的援助,提前感谢!

自适应触发器上的UWP加载样式

您不能覆盖资源,但可以更改Button的样式属性。

你首先必须给按钮一个名字:

 <Button x:Name="MyButton" Style="{StaticResource ButtonFormat}">
 </Button>

现在您可以使用VisualStateManager更改Style属性:

<VisualState x:Name="BigView">
    <VisualState.StateTriggers>
       <AdaptiveTrigger MinWindowWidth="550" />
    </VisualState.StateTriggers>
    <VisualState.Setters>
        <Setter Target="MyButton.Style" 
                Value="{StaticResource ButtonFormatBlue}" />
    </VisualState.Setters>
</VisualState>

我看到有人建议使用C#而不是visualstatemanager,但我没有完全理解这一描述。

这意味着您可以在代码后面手动为Button设置样式。例如,您可以将ButtonFormatButtonFormatBlue都放在应用程序资源中,如下所示:

<Application.Resources>
    <Style TargetType="Button" x:Key="ButtonFormat">
        <Setter Property="Background" Value="#FF6E1400" />
        <Setter Property="Margin" Value="5,5,5,5" />
    </Style>
    <Style TargetType="Button" x:Key="ButtonFormatBlue">
        <Setter Property="Background" Value="Blue" />
        <Setter Property="Margin" Value="5,5,5,5" />
    </Style>
</Application.Resources>

然后您的Button可以使用StaticResource:加载ButtonFormat样式

<Button x:Name="styleTestButton" Content="Style Sample" Style="{StaticResource ButtonFormat}"
        VerticalAlignment="Bottom" Click="styleTestButton_Click" />

例如,在Button点击事件中,您可以按如下方式更改Button的样式:

private void styleTestButton_Click(object sender, RoutedEventArgs e)
{
    var ButtonFormatBlue = Application.Current.Resources.FirstOrDefault(r => r.Key.ToString() == "ButtonFormatBlue");
    styleTestButton.Style = ButtonFormatBlue.Value as Style;
}

或者,您可以在代码隐藏中完全定义一个新样式,并使用代码隐藏中的C#将此样式设置为Button

private void styleTestButton_Click(object sender, RoutedEventArgs e)
{
    var dynamicStyle = new Style();
    dynamicStyle.TargetType = typeof(Button);
    dynamicStyle.Setters.Add(new Setter(BackgroundProperty, Colors.Blue));
    dynamicStyle.Setters.Add(new Setter(MarginProperty, new Thickness(5, 5, 5, 5)));
    styleTestButton.Style = dynamicStyle;
}

需要知道的是,正如@MZetko所说,我们不能覆盖资源,这就是我们创建新资源的原因。

是否可以按照我的意愿从visualstatetrigger加载它,或者我看错了方向?

是的,这是可能的,但很难说你是否看错了方向,这取决于不同的场景。例如,如果UIElements在DataTemplate中,那么它不适用于StateTriggers,那么数据绑定是该场景的最佳解决方案。您可以参考VisualStateManager类的备注,它展示了使用VisualStateManager的完美细节。