質問

私は(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>

をアプリケーションにカスタマイズのこのフォームは(基本的にはいくつかの色を変更)を許可するための最良の方法は何ですか?

<時間>

[更新]

私はちょうどをhref="https://stackoverflow.com/questions/529621/wpf-edit-resource/529687#529687">発見し、試してみましたそれが、私はPetojが与えられた答えのコメントで述べたと同様の InvalidOperationExceptionがの例外を取得しています。ここに答えからのサンプルコードがあります:

の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がある場合、すべてのアプリケーション・レベルのリソースが自動的に凍結されています。あなたは、ウィンドウレベルのような低いレベルでそれを追加した場合、それは動作します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top