0

试图了解一些关于 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 加载它,还是我看错了方向?

感谢所有帮助,在此先感谢您!

4

2 回答 2

1

您不能覆盖资源,但可以更改 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>
于 2016-07-28T17:06:37.807 回答
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" />

例如,在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;
}

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

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

于 2016-07-29T06:52:38.720 回答