自适应触发器上的 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
设置样式。例如,您可以将 ButtonFormat
和 ButtonFormatBlue
都放在 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 class的Remarks,完美的使用VisualStateManager
.
试图了解一些关于 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
设置样式。例如,您可以将 ButtonFormat
和 ButtonFormatBlue
都放在 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 class的Remarks,完美的使用VisualStateManager
.