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

时间:2016-07-28 15:48:22

标签: c# styles uwp visualstatemanager application-resource

试着学习一些关于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加载它,或者我是否正在查看错误的方向?

所有的艾滋病都很感激,谢谢你们!

2 个答案:

答案 0 :(得分:1)

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

首先必须给按钮命名:

Sub Insert_Molecules()

Dim Molecules() As Integer

Dim m As Integer, n As Integer
Dim i As Integer, j As Integer

m = 10
n = 10

ReDim Molecules(1 To m, 1 To n) As Integer
For i = 1 To m
For j = 1 To n
Cells(i, j).Interior.Color = RGB(255, 0, 0)
Next j
Next i

End Sub

现在您可以使用Molecules(i * Rnd, j * Rnd) = Cells(i, j).Interior.Color = RGB(255, 0, 0) 更改 <Button x:Name="MyButton" Style="{StaticResource ButtonFormat}"> </Button> 属性:

VisualStateManager

答案 1 :(得分:0)

  

我看到有人建议使用C#而不是visualstatemanagers,但我没有正确理解该描述。

这意味着您可以在后面的代码中手动设置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可以使用ButtonFormat加载StaticResource样式:

<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 class备注,它会显示使用VisualStateManager的完美详情。