4

WPFでMV-VMパターンを使用していますが、かなり頻繁に使用する背景ブラシがあり、それを共有ResourceDictionaryに移動したいと思います。

唯一の問題は、ブラシがホストされたコンテキストへのデータバインディングを介して取得した色を使用することです。

とにかく、ブラシをResourceDictionaryに移動しても、必要な値を見つけることができますか?

ブラシ:

<RadialGradientBrush>
    <RadialGradientBrush.RelativeTransform>
        <TransformGroup>
            <ScaleTransform CenterX="0.5"
                            CenterY="0.5"
                            ScaleX="2.3"
                            ScaleY="2.3" />
            <TranslateTransform X="-0.3"
                                Y="-0.3" />
        </TransformGroup>
    </RadialGradientBrush.RelativeTransform>
    <GradientStop Color="{Binding Path=BackdropColor}"
                  Offset="1.2" />
    <GradientStop Color="#FFFFFFFF"
                  Offset="-0.1" />
</RadialGradientBrush>

ResourceDictionaryにリファクタリングしてキーを追加した後、次のように呼び出しました。

<StackPanel Grid.Row="0"
            Margin="0,0,0,0"
            Orientation="Horizontal"
            Background="{DynamicResource BackdropRadGradBrush}">

しかし、これにより、デバッガーで次の出力が生成されました。

System.Windows.Dataエラー:2:ターゲット要素の支配的なFrameworkElementまたはFrameworkContentElementが見つかりません。BindingExpression:Path = BackgroundColor; DataItem = null; ターゲット要素は'GradientStop'(HashCode = 16001149); ターゲットプロパティは「Color」(タイプ「Color」)です

4

2 に答える 2

3

Brushこれをリソースディクショナリに保持し、バインディングを使用して色を引き出すことはできないと思います。ブラシは一度だけ作成されるため(これが、最初にリソースディクショナリにブラシを配置する理由です)、作成時にWPFはブラシが使用される場所を認識しないため、次の値を取得できません。色。

たとえば、色が設定に保持されている場合、それはおそらく機能しますが、使用されている各コントロールで色を変更する必要があるため、それは役に立たないと思います(そうでない場合は、色をハードコーディングしないと、すでに設定に含まれています)。

たぶん、RadialGradientBrushサブクラスを作成して、最初のGradientStop色をDependencyProperty?として公開することができます。次に、必要な場所にこのサブクラスのインスタンスを作成し、バインディングを使用してそこに正しい色を取り込むことができます。

于 2009-05-31T15:24:03.843 に答える
0

これは少し遅れていますが、-の代わりにStaticResourceまたはを使用することを検討してください。これにより、別のリソースにアクセスできるようになります。完全ではありませんが、何もないよりはましです。DynamicResourceBindingBinding

于 2009-07-08T17:46:23.613 に答える