2009-02-25 4 views
22

wpfスタイルのbasedOnプロパティをdynamicresourcesで使用する方法があるのだろうかと思います。例えばDynamicResourcesのBasedOn Styleプロパティの使用

<Style BasedOn="{DynamicResource somestyle}"> 
    <Setter Property="SomeProp" Value="SomeValue"/> 
</Style> 

BasedOnスタイルと組み合わせて動的リソースの使用が不可能であることを示すエラーをスローします。 誰かがそれをどうやってできるのだろうか? ありがとう

答えて

15

主な理由は、封印されたオブジェクトだと思います。スタイル階層がある場合:

 Style A 
    /  \ 
    Style A1 Style A2 

これは難しいシナリオではないかもしれません。 StyleAは動的リソースを使用しているため、そのリソースが変更されると、Style A1Style A2はそれぞれBasedOnプロパティを変更する必要があります。ただし、スタイルがアプリケーションで使用されると、それはシールされたオブジェクトになります。 Style Aは不変になります。あなたが使用することができます

つの回避策は次のとおりです。

  1. Style Aを変更する必要があります。
  2. 新しいStyle Aリソースになる新しいスタイルオブジェクトを作成します。
  3. Style A1Style A2の新しいバージョンを作成します。 SettersResourcesなどのコピーを作成するコピー手順を作成する必要があります。BasedOnStyle Aの新しいバージョンに設定します。
  4. 3つの新しいスタイルがそこにあるようにリソースコレクションを更新します。

{DynamicResource StyleA1}{DynamicResource StyleA2}は今(ステップ4から)は、これらのリソースの変更事実をピックアップし、自動的にすべての参照を更新する必要があります。

これは非常に簡単なシナリオです。実世界スタイルの階層は、特に複数のファイルにまたがっていて、結合された辞書に由来する場合は、より複雑になります。

私はあなたの問題を理解し、助けました。

+4

別の(Ux)チームが基本スタイルを作成します。開発者は、基本スタイルに加えていくつかのプロパティを設定したいと考えています。理想的には、これはDevStyle BasedOn "DynamicResource UxStyle"が助けてくれたシナリオです。これが不可能な場合は、コントロールに適用する前に2つのスタイルをマージする選択肢は何ですか? – Gishu

12

私はあなたがDynamicResourceBasedOnを使用することができないので、あなたは現在のウィンドウ/ユーザーコントロール/何にあなたの「親」のリソースを保持ResourceDictionaryをマージしStaticResourceDynamicResourceを「変換」することができますことを発見しました。このようにして、StaticResourceを使用してリソースオブジェクト(例:Style)を参照できるようになりました。この方法でDynamicResource(換算)にDatatriggersを使用することができます。

例:

<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/MyProject.Styles;component/ButtonStyles.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
     [*Your other resources can be put here*] 
    </ResourceDictionary> 
</Window.Resources> 

... 

<Button Command="{Binding MyCommandInViewModel, RelativeSource={RelativeSource AncestorType=Window}}"> 
    <Button.Style> 
     <Style BasedOn="{StaticResource StyleFromButtonStyles}" TargetType="Button"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding SomeBool}" Value="True"> 
        <Setter Property="Button.Content" Value="{StaticResource SomeImage}"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding SomeBool}" Value="False"> 
        <Setter Property="Button.Content" Value="{StaticResource SomeOtherImage}"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 

したがってDatatriggersインポートResourceDictionaryにスタイルボタンに適用されます。

希望すると便利です。

関連する問題