Ресурсы темы для определения цвета остановки градиента UWP

Я создаю приложение UWP. У меня несколько LinearGradientBrushes, где цвет задается прямо в ссылке LinearGradientBrush как GradientStops. Однако я хочу иметь предопределенный набор цветов, определенных в справочнике ресурсов, который я могу использовать как ссылку для каждого GradientStop, так что изменение цветовой схемы для приложения связано с изменением значений SolidColorBrushes:

   <!--Resource Dictionary  -->
<ResourceDictionary.ThemeDictionaries>
        <ResourceDictionary x:Key="Default">
             <SolidColorBrush x:Key="stop1" Color="#FF5A5A5A"/>
<SolidColorBrush x:Key="stop2" Color="#FF222222"/>
</ResourceDictionary>
<ResourceDictionary x:Key="Dark">
             <SolidColorBrush x:Key="stop1" Color="Black"/>
<SolidColorBrush x:Key="stop2" Color="White"/>
</ResourceDictionary>
<ResourceDictionary x:Key="HighContrast">
             <SolidColorBrush x:Key="stop1" Color="Black"/>
<SolidColorBrush x:Key="stop2" Color="White"/>
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
    <!-- control Template-->
    <LinearGradientBrush x:Key="gradient">
      <GradientStop Color="{Binding Source={Themeresource stop1},Path=Color}" Offset="0"/>
      <GradientStop Color="{Binding Source={Themeresource stop2},Path=Color}" Offset="1"/>
    </LinearGradientBrush>

Ошибка выдачи, что nam/key stop1 не найден

2 ответа

Вышеуказанную проблему можно решить, используя привязку

public LinearGradientBrush GradientBrush
    {
        get { return _GradientBrush; }
        set
        {
            _GradientBrush = value;
            RaisePropertyChanged("GradientBrush");
        }
    }
 GradientBrush = GetGradientBrush();

 public static LinearGradientBrush GetGradientBrush()
    {
        var grColor1 = ((SolidColorBrush)Application.Current.Resources["stop1"]).Color;
        var grColor2 = ((SolidColorBrush)Application.Current.Resources["stop2"]).Color;
        LinearGradientBrush lgBrush = new LinearGradientBrush();
        lgBrush.GradientStops.Add(new GradientStop() { Color = grColor1, Offset = 0.1 });
        lgBrush.GradientStops.Add(new GradientStop() { Color = grColor2, Offset = 0.9 });

        lgBrush.StartPoint = new Point(0, 1);
        lgBrush.EndPoint = new Point(1, 0);

       return lgBrush;
    }

<Grid Background="{Binding GradientBrush}" >

Проблема в stop1 статический ресурс, но не Themeresource. Итак, нам нужно отредактировать источник привязки какStaticResource.

<LinearGradientBrush x:Key="gradient">
    <GradientStop Color="{Binding Source={StaticResource stop1},Path=Color}" Offset="0"/>
    <GradientStop Color="{Binding Source={StaticResource stop2},Path=Color}" Offset="1"/>
</LinearGradientBrush>

Обновить

Для тестирования, если мы разместим выше в ResourceDictionary, это сработает.

<Page.Resources>
    <ResourceDictionary>
        <ResourceDictionary.ThemeDictionaries>
            <ResourceDictionary x:Key="Default">
                <SolidColorBrush x:Key="stop1" Color="#FF5A5A5A"/>
                <SolidColorBrush x:Key="stop2" Color="#FF222222"/>
            </ResourceDictionary>
            <ResourceDictionary x:Key="Dark">
                <SolidColorBrush x:Key="stop1" Color="Black"/>
                <SolidColorBrush x:Key="stop2" Color="White"/>
            </ResourceDictionary>
            <ResourceDictionary x:Key="HighContrast">
                <SolidColorBrush x:Key="stop1" Color="Black"/>
                <SolidColorBrush x:Key="stop2" Color="White"/>
            </ResourceDictionary>
        </ResourceDictionary.ThemeDictionaries>
   

 
    <!-- control Template-->
    <LinearGradientBrush x:Key="gradient">
        <GradientStop Color="{Binding Source={ThemeResource stop1},Path=Color}" Offset="0"/>
        <GradientStop Color="{Binding Source={ThemeResource stop2},Path=Color}" Offset="1"/>
    </LinearGradientBrush>
    </ResourceDictionary>
</Page.Resources>
Другие вопросы по тегам