WPF:実行時にApp.xamlからリソース(色)を変更します
-
16-09-2019 - |
質問
私は(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));
この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>
をアプリケーションにカスタマイズのこのフォームは(基本的にはいくつかの色を変更)を許可するための最良の方法は何ですか?の
<時間>の [更新] の
の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>
のC#の:の
LinearGradientBrush myBrush = FindResource("MainBrush") as LinearGradientBrush;
myBrush.GradientStops[0].Color = Colors.Red;
解決
に見えます?
私は別のファイルに含まれるリソースディクショナリ内のリソースを定義するお勧めします。次に、コード内であなたがなるようにリソースをロードすることができます(App.csを変更し、その後他の場所で、デフォルトをロードする):
//using System.Windows
ResourceDictionary dict = new ResourceDictionary();
dict.Source = new Uri("MyResourceDictionary.xaml", UriKind.Relative);
Application.Current.Resources.MergedDictionaries.Add(dict);
また、App.xamlで、デフォルトのリソースディクショナリを定義することができますし、うまくコードでそれをアンロードします。
MergedDictionariesを使用すると、実行時に使用している辞書を変更するオブジェクトを使用します。すぐに全体のインターフェイスを変更するための魔法のように動作します。
他のヒント
ランタイムでアプリケーション全体のリソースを変更するようなものです。
Application.Current.Resources("MainBackgroundBrush") = Brsh
と、InvalidOperationExceptionについて、私はウォールストリートプログラマーが正しいと思います。 たぶん、あなたは、既存のブラシを変更しようとするが、代わりにあなたが必要とするすべてのgradientstopsとコードで新しいブラシを作成し、アプリケーションリソースで、この新しいブラシを割り当てるべきではありません。
一部GradientStopsの色を変更する別のアプローチは、アプリケーションのようなワイドSolidColorBrushesにDynamicResource参照として、それらの色を定義することです
<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>
、次に使用
Application.Current.Resources["FirstColor"] = NewFirstColorBrsh
Application.Current.Resources["SecondColor"] = NewSecondColorBrsh
HTH
ブラシ(またはClone()
ような任意の他の凍結可能なオブジェクト)のディープコピーを作成するためにStoryboard
メソッドを使用し、それを使用します。
LinearGradientBrush myBrush = FindResource("MainBrush") as LinearGradientBrush;
myBrush = myBrush.Clone();
myBrush.GradientStops[0].Color = Colors.Red;
@WallstreetProgrammerは権利である - すべてのアプリケーションレベルのリソースは、デフォルトで凍結されている。
。あなたが最初のオブジェクトのクローンを作成する必要がある理由厥ます。
あなたは例外を取得します。彼らは冷凍可能であり、LinearGradientBrushがある場合、すべてのアプリケーション・レベルのリソースが自動的に凍結されています。あなたは、ウィンドウレベルのような低いレベルでそれを追加した場合、それは動作します。