构建我的UWP应用程序时不使用Style中的ThemeResource

时间:2016-05-30 21:35:06

标签: xaml uwp

我正在尝试制作一个在敲击事件后改变颜色的矩形。它应该在禁用模式(灰色)和强调颜色之间循环。我想尝试使用样式。当我在XAML代码{ThemeResource SystemControlHighlightAltListAccentHighBrush}中使用(阴影)强调色时,它会正确显示强调色。它还在设计器(Visual Studio)中显示正确的颜色。但是,如果我在资源字典中使用主题颜色,它会在我的应用程序(构建后)中用灰色或无颜色替换它们。这是我的ResourceDictionary:

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:I_have_never">
    <!--Disabled-->
    <Style TargetType="RelativePanel" x:Key="Disabled">
        <Setter Property="Tag">
            <Setter.Value>0</Setter.Value>
        </Setter>
        <Setter Property="Margin">
            <Setter.Value>30,15,30,15</Setter.Value>
        </Setter>
        <Setter Property="Background">
            <Setter.Value>{ThemeResource SystemControlBackgroundListLowBrush}    </Setter.Value>
        </Setter>
    </Style>

    <!--Enabled-->
    <Style TargetType="RelativePanel" x:Key="Enabled">
        <Setter Property="Tag">
            <Setter.Value>2</Setter.Value>
        </Setter>
        <Setter Property="Margin">
            <Setter.Value>30,15,30,15</Setter.Value>
        </Setter>
        <Setter Property="Background">
            <Setter.Value>{ThemeResource SystemControlHighlightAltListAccentHighBrush}</Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

这是我的XAML代码:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="150" />
        <RowDefinition />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <RelativePanel Name="Category1"
                           Grid.Row="0" 
                           Grid.Column="0"
                           Tapped="ToggleStatus" 
                           Style="{StaticResource Enabled}">
    </RelativePanel>
</Grid>

这是我在C#代码之间切换样式:

private void ToggleStatus(object sender, RoutedEventArgs e)
    {
        RelativePanel panel = sender as RelativePanel;

        if ((string)panel.Tag == "0")
        {
            panel.Style = (Style)App.Current.Resources["Enabled"]; // Tag = 1
        }
        else if ((string)panel.Tag == "1")
        {
            panel.Style = (Style)App.Current.Resources["Disabled"]; // Tag = 2
        }
    }

在设计视图中,这非常有用。它很好地显示了灰色或强调色背景。但是,当我构建它时,不会显示任何颜色。

只要我使用真实颜色(例如灰色)而不是ThemeResource,它确实会显示颜色。如果我在XAML代码中使用ThemeResource直(无样式),它也可以工作。为什么它只适用于设计师?如果我在样式中使用ThemeResource,为什么它不起作用?我怎么能解决这个问题?

1 个答案:

答案 0 :(得分:1)

  

如果我在样式中使用ThemeResource,为什么它不起作用?我怎么能解决这个问题?

您正在使用 XAML属性元素使用语法 extensionUsage (即{ThemeResource}{StaticResource})设置为Setter.Value property in风格:

<Setter ...>
  <Setter.Value>
    objectValue
  </Setter.Value>
</Setter>

根据官方文档Setter.Value property语法部分,设置 extensionUsage (即{ThemeResource}{StaticResource})时对于样式中的Setter.Value property,我们应该使用 XAML属性用法语法而不是使用XAML属性元素用法语法:

<Setter Property="propertyName" Value="extensionUsage"/>

因此,您应该使用以下代码在样式中设置背景{ThemeResource}

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:ThemeResourceInStyle">

<!--Disabled-->
<Style TargetType="RelativePanel" x:Key="Disabled">
    <Setter Property="Tag">
        <Setter.Value>0</Setter.Value>
    </Setter>
    <Setter Property="Margin">
        <Setter.Value>30,15,30,15</Setter.Value>
    </Setter>
    <!--use XAML Attribute Usage Syntax to set extensionUsage -->
    <Setter Property="Background" Value="{ThemeResource SystemControlBackgroundListLowBrush}" />
</Style>

<!--Enabled-->
<Style TargetType="RelativePanel" x:Key="Enabled">
    <Setter Property="Tag">
        <Setter.Value>1</Setter.Value>
    </Setter>
    <Setter Property="Margin">
        <Setter.Value>30,15,30,15</Setter.Value>
    </Setter>
    <!--use XAML Attribute Usage Syntax to set extensionUsage -->
    <Setter Property="Background" Value="{ThemeResource SystemControlHighlightAltListAccentHighBrush}" />
</Style>
</ResourceDictionary>