如何以编程方式构造 Windows::UI::Xaml::Style class
How to construct Windows::UI::Xaml::Style class programmatically
我正在尝试以编程方式为所有按钮构建一个 winrt::Windows::UI::Xaml::Style
对象。但是,某些样式 Setter
不符合我的预期。
总而言之,BorderThickness
、BorderBrush
、Foreground
和 Margin
属性的 Setter
s 不起作用。另一方面,FontSize
和 Background
属性的 Setter
s 工作正常。我该如何纠正这个问题。
一个Style
对象是这样构造的。
void MainPage::SetStylePropertySetters()
{
coloredButtonStyle.Setters().Append(Setter{ // doesn't work
Control::BorderThicknessProperty(),
box_value(ThicknessHelper::FromUniformLength(10.5)) });
coloredButtonStyle.Setters().Append(Setter{ // doesn't work
Control::BorderBrushProperty(),
box_value(Colors::Black()) });
coloredButtonStyle.Setters().Append(Setter{ // works right
Control::FontSizeProperty(),
box_value(50) });
coloredButtonStyle.Setters().Append(Setter{ // doesn't work
Control::ForegroundProperty(),
box_value(Colors::White()) });
coloredButtonStyle.Setters().Append(Setter{ // doesn't work
FrameworkElement::MarginProperty(),
box_value(ThicknessHelper::FromLengths(10, 10, 0, 0)) });
coloredButtonStyle.Setters().Append(Setter{ // works right
Control::BackgroundProperty(),
GenerateGradient() });
}
LinearGradientBrush MainPage::GenerateGradient()
{
GradientStopCollection gradientStopCollection{};
GradientStop gs1;
gs1.Color(Colors::Yellow());
gs1.Offset(0);
gradientStopCollection.Append(gs1);
GradientStop gs2;
gs2.Color(Colors::Orange());
gs2.Offset(0.5);
gradientStopCollection.Append(gs2);
GradientStop gs3;
gs3.Color(Colors::Red());
gs3.Offset(1.0);
gradientStopCollection.Append(gs3);
return LinearGradientBrush(gradientStopCollection, 0.0);
}
然后在 MainPage
.
的构造函数中将样式应用于按钮
MainPage::MainPage() :
coloredButtonStyle{ xaml_typename<Button>() }
{
InitializeComponent();
// Apply a style to a button named DefaultButton
SetStylePropertySetters();
DefaultButton().Style(coloredButtonStyle);
}
主页面有一个名为 DefaultButton
的按钮。
<Page
x:Class="HeadedAppDesign.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:HeadedAppDesign"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<StackPanel>
<Button x:Name="DefaultButton" Content="Button"/>
</StackPanel>
</Page>
这会产生以下结果:
对于Thickness
类型的属性,同样传递字符串对象
XAML 标记中的格式。对于 Brush
类型属性,传递 Brush
class.
的派生 class 对象之一
void MainPage::SetStylePropertySetters()
{
coloredButtonStyle.Setters().Append(Setter{
Control::BorderThicknessProperty(),
box_value(L"10.5") });
coloredButtonStyle.Setters().Append(Setter{
Control::BorderBrushProperty(),
SolidColorBrush(Colors::Black()) });
coloredButtonStyle.Setters().Append(Setter{
Control::FontSizeProperty(),
box_value(50) });
coloredButtonStyle.Setters().Append(Setter{
Control::ForegroundProperty(),
SolidColorBrush(Colors::White()) });
coloredButtonStyle.Setters().Append(Setter{
FrameworkElement::MarginProperty(),
box_value(L"10, 10, 0, 0") });
coloredButtonStyle.Setters().Append(Setter{
Control::BackgroundProperty(),
GenerateGradient() });
}
按钮的边距、边框宽度和颜色、字体大小和颜色以及背景渐变都按照我的预期应用。
我正在尝试以编程方式为所有按钮构建一个 winrt::Windows::UI::Xaml::Style
对象。但是,某些样式 Setter
不符合我的预期。
总而言之,BorderThickness
、BorderBrush
、Foreground
和 Margin
属性的 Setter
s 不起作用。另一方面,FontSize
和 Background
属性的 Setter
s 工作正常。我该如何纠正这个问题。
一个Style
对象是这样构造的。
void MainPage::SetStylePropertySetters()
{
coloredButtonStyle.Setters().Append(Setter{ // doesn't work
Control::BorderThicknessProperty(),
box_value(ThicknessHelper::FromUniformLength(10.5)) });
coloredButtonStyle.Setters().Append(Setter{ // doesn't work
Control::BorderBrushProperty(),
box_value(Colors::Black()) });
coloredButtonStyle.Setters().Append(Setter{ // works right
Control::FontSizeProperty(),
box_value(50) });
coloredButtonStyle.Setters().Append(Setter{ // doesn't work
Control::ForegroundProperty(),
box_value(Colors::White()) });
coloredButtonStyle.Setters().Append(Setter{ // doesn't work
FrameworkElement::MarginProperty(),
box_value(ThicknessHelper::FromLengths(10, 10, 0, 0)) });
coloredButtonStyle.Setters().Append(Setter{ // works right
Control::BackgroundProperty(),
GenerateGradient() });
}
LinearGradientBrush MainPage::GenerateGradient()
{
GradientStopCollection gradientStopCollection{};
GradientStop gs1;
gs1.Color(Colors::Yellow());
gs1.Offset(0);
gradientStopCollection.Append(gs1);
GradientStop gs2;
gs2.Color(Colors::Orange());
gs2.Offset(0.5);
gradientStopCollection.Append(gs2);
GradientStop gs3;
gs3.Color(Colors::Red());
gs3.Offset(1.0);
gradientStopCollection.Append(gs3);
return LinearGradientBrush(gradientStopCollection, 0.0);
}
然后在 MainPage
.
MainPage::MainPage() :
coloredButtonStyle{ xaml_typename<Button>() }
{
InitializeComponent();
// Apply a style to a button named DefaultButton
SetStylePropertySetters();
DefaultButton().Style(coloredButtonStyle);
}
主页面有一个名为 DefaultButton
的按钮。
<Page
x:Class="HeadedAppDesign.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:HeadedAppDesign"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<StackPanel>
<Button x:Name="DefaultButton" Content="Button"/>
</StackPanel>
</Page>
这会产生以下结果:
对于Thickness
类型的属性,同样传递字符串对象
XAML 标记中的格式。对于 Brush
类型属性,传递 Brush
class.
void MainPage::SetStylePropertySetters()
{
coloredButtonStyle.Setters().Append(Setter{
Control::BorderThicknessProperty(),
box_value(L"10.5") });
coloredButtonStyle.Setters().Append(Setter{
Control::BorderBrushProperty(),
SolidColorBrush(Colors::Black()) });
coloredButtonStyle.Setters().Append(Setter{
Control::FontSizeProperty(),
box_value(50) });
coloredButtonStyle.Setters().Append(Setter{
Control::ForegroundProperty(),
SolidColorBrush(Colors::White()) });
coloredButtonStyle.Setters().Append(Setter{
FrameworkElement::MarginProperty(),
box_value(L"10, 10, 0, 0") });
coloredButtonStyle.Setters().Append(Setter{
Control::BackgroundProperty(),
GenerateGradient() });
}
按钮的边距、边框宽度和颜色、字体大小和颜色以及背景渐变都按照我的预期应用。