如何以编程方式构造 Windows::UI::Xaml::Style class

How to construct Windows::UI::Xaml::Style class programmatically

我正在尝试以编程方式为所有按钮构建一个 winrt::Windows::UI::Xaml::Style 对象。但是,某些样式 Setter 不符合我的预期。

总而言之,BorderThicknessBorderBrushForegroundMargin 属性的 Setters 不起作用。另一方面,FontSizeBackground 属性的 Setters 工作正常。我该如何纠正这个问题。

一个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() });
}

按钮的边距、边框宽度和颜色、字体大小和颜色以及背景渐变都按照我的预期应用。