0

私のプロジェクトが参照するdllの1つで提供されているテーマを使用しています。

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/SomeNameSpace;component/Themes/SomeTheme.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

このテーマには、修正したいブラシがあります。ブラシの「キー」がわかっている場合 (snoop を使用して検出)、それを再定義して別の色にすることはできますか?

以下を試してみましたが、効果がありませんでした。

    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/SomeNameSpace;component/Themes/SomeTheme.xaml"/>
            </ResourceDictionary.MergedDictionaries>

            <LinearGradientBrush x:Key="keyNameFoundUsingSnoop">
                ...new value
            </LinearGradientBrush>
        </ResourceDictionary>
    </Application.Resources>

再コンパイルする xaml がない場合や、その場でキー値を変更したい場合に、このタイプのことが可能かどうか疑問に思っていました。

編集:これをXAMLで機能させることができませんでしたが、コードで同様のものを得ることができました:

void ReplaceResource(ResourceDictionary _res, object _key, object _replacement)
    {
        foreach (var i in _res.Keys)
        {
            if (object.Equals(i, _key))
            {
                _res[i] = _replacement;
            }
        }

        foreach (var i in _res.MergedDictionaries)
        {
            ReplaceResource(i, _key, _replacement);
        }
    }

(私の場合は複数の辞書にあったので、キーを見つけても壊れません)

使用法 :

var lightGray = new SolidColorBrush(Color.FromArgb(50, 255, 255, 255));
ReplaceResource(Application.Current.Resources, "KeyToFind", lightGray);
4

0 に答える 0