【问题标题】:Theme Resources to define gradient stop color UWP用于定义渐变停止颜色 UWP 的主题资源
【发布时间】:2024-01-17 11:21:01
【问题描述】:

我正在创建 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 的 Giving 错误

【问题讨论】:

    标签: binding resources uwp-xaml gradientstop


    【解决方案1】:

    问题是 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>
    

    【讨论】:

    • 我已经编辑了上面的代码。看看它。实际上我想绑定到themeresouce,这样我就可以支持系统他们改变,即dakmode,high contrast,lightmode
    • 我发现你使用了错误的代码Themeresource应该是ThemeResource
    • 我使用过 ThemeResource 但它仍然给出 key not found 错误
    • 我使用了相同的ThemeResource,它可以在我身边工作,你能不能给我们分享一个空白样本。
    【解决方案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}" >
    

    【讨论】: