WPF:在运行时期间从App.xaml更改资源(颜色)

And*_*ech 10 wpf resources customization xaml app.xaml

我试图让我的应用程序更可定制,允许用户从拾色器对话框中选择一种颜色,然后实时更改应用程序的样式(使用DynamicResource)

如何更改驻留在的特定资源app.xaml


我尝试过类似的东西,但没有运气(只是一个测试):

var colorDialog = new CustomControls.ColorPickerDialog();
var dResult = colorDialog.ShowDialog();
var x = Application.Current.Resources.Values.OfType<LinearGradientBrush>().First();
x = new LinearGradientBrush();
x.GradientStops.Add(new GradientStop(colorDialog.SelectedColor,1));
Run Code Online (Sandbox Code Playgroud)

这是app.xaml文件的摘录:

<Application.Resources>
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="HeaderBackground">
            <GradientStop Color="#82cb02" Offset="1"/>
            <GradientStop Color="#82cb01" Offset="0.2"/>
            <GradientStop Color="#629a01" Offset="0.5"/>
        </LinearGradientBrush>
Run Code Online (Sandbox Code Playgroud)

允许这种形式的可定制性(基本上只是改变一些颜色)到应用程序的最佳方法是什么?


[更新]

我刚从上一个被问到的问题中找到了这个答案,并尝试了但是我得到了与给定答案的评论中提到的相同的InvalidOperationException异常Petoj.以下是答案中的示例代码:

Xaml:

<LinearGradientBrush x:Key="MainBrush" StartPoint="0, 0.5" EndPoint="1, 0.5" >
    <GradientBrush.GradientStops>
        <GradientStop Color="Blue" Offset="0" />
        <GradientStop Color="Black" Offset="1" />
    </GradientBrush.GradientStops>
</LinearGradientBrush>
Run Code Online (Sandbox Code Playgroud)

C#:

LinearGradientBrush myBrush = FindResource("MainBrush") as LinearGradientBrush;
myBrush.GradientStops[0].Color = Colors.Red;
Run Code Online (Sandbox Code Playgroud)

Wil*_*ins 15

看起来你正试图做某种剥皮?

我建议在包含在单独文件中的资源字典中定义资源.然后在代码中(App.cs加载默认值,然后在其他地方更改),您可以加载资源,如下所示:

//using System.Windows
ResourceDictionary dict = new ResourceDictionary();
dict.Source = new Uri("MyResourceDictionary.xaml", UriKind.Relative);

Application.Current.Resources.MergedDictionaries.Add(dict);
Run Code Online (Sandbox Code Playgroud)

您还可以在App.xaml中定义默认资源字典,并在代码中将其卸载.

使用MergedDictionaries对象更改您在运行时使用的字典.就像一个快速更改整个界面的魅力.

  • 请记住,MergedDictionaries 是一个容器。最近添加的 ResourceDictionary 中的资源获胜。如果意图以任何规律在词典之间来回翻转,则从列表中删除先前的词典可能会有所帮助。(答案提到“在代码中卸载它”,这是 XAML 指定的默认值,但没有显示如何识别和删除它。) (2认同)

Nik*_*kos 11

在运行时更改应用程序范围的资源就像:

Application.Current.Resources("MainBackgroundBrush") = Brsh
Run Code Online (Sandbox Code Playgroud)

关于InvalidOperationException,我想WallStreet Programmer是对的.也许您不应该尝试修改现有的画笔,而是在代码中创建一个新的画笔,其中包含您需要的所有渐变效果,然后在应用程序资源中分配这个新画笔.

另一种改变某些GradientStops颜色的方法是将这些颜色定义为DynamicResource对Application Wide SolidColorBrushes的引用,如:

<LinearGradientBrush x:Key="MainBrush" StartPoint="0, 0.5" EndPoint="1, 0.5" >
<GradientBrush.GradientStops>
    <GradientStop Color="{DynamicResource FirstColor}" Offset="0" />
    <GradientStop Color="{DynamicResource SecondColor}" Offset="1" />
</GradientBrush.GradientStops>
Run Code Online (Sandbox Code Playgroud)

然后使用

Application.Current.Resources["FirstColor"] = NewFirstColorBrsh
Application.Current.Resources["SecondColor"] = NewSecondColorBrsh
Run Code Online (Sandbox Code Playgroud)

HTH