我正在尝试制作一个在敲击事件后改变颜色的矩形。它应该在禁用模式(灰色)和强调颜色之间循环。我想尝试使用样式。当我在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
,为什么它不起作用?我怎么能解决这个问题?
答案 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>