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

UWP load style on adaptive trigger

试图了解一些关于 s 的知识,但我被困在了一个特定的主题上。我希望使用我拥有的预制样式编辑按钮的大小和对齐方式。一个例子:

         <Button Style="{StaticResource ButtonFormat}">

        </Button>

按钮有样式保存在App.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> 

现在,这是我的困境:

我想加载另一种覆盖 "ButtomFormat" 的样式。我一直在尝试在 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# 而不是 visualstatemanagers,但我没有正确理解该描述,是否可以根据需要从 visualstatetrigger 加载它,还是我看错了方向?

感谢所有帮助,提前致谢!

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

您首先必须为按钮命名:

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

I saw someone suggesting using C# instead of visualstatemanagers but I didn't properly understand that description.

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

<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 所说,我们不能覆盖资源,这就是我们创建新资源的原因。

is it possible to load it from the visualstatetrigger as I want or am I looking at the wrong direction?

是有可能,但很难判断你是否看错了方向,这取决于不同的场景。例如,如果您的 UIElements 在 DataTemplate 中,那么它不适用于 StateTriggers,数据绑定是这种情况下的最佳解决方案。可以参考VisualStateManager classRemarks,完美的使用VisualStateManager.