2016-10-14 11 views
0

これらの項目が動的に作成される場所のMenuItemコントロールにアイコンをバインドします。私はx:Shared属性をFalseに設定しようとしましたが、常に最後の項目だけがアイコンを持っています。WPF MenuItemアイコン共有

<Window.Resources> 
    <Style TargetType="{x:Type MenuItem}" x:Key="MenuItemStyle" x:Shared="False"> 
     <Setter Property="Icon"> 
      <Setter.Value> 
       <Image Source="{Binding IconSource}" /> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Window.Resources> 

そして、MenuItemの定義:私はすでにImageコントロールが、運にこの共有属性を設定しようとした

<MenuItem Header="Workspaces" ItemsSource="{Binding WorkspaceItems}" Icon="{StaticResource BranchIcon}" ItemContainerStyle="{StaticResource MenuItemStyle}" /> 

は、ここに私のMenuItem ItemContainerStyleコードのスタイルです。

提案がありますか?

+0

Visual Studioの出力ウィンドウにバインディングエラーまたは警告が表示されますか? – haindl

+0

いいえ、それはコンパイル可能です。それは1つのアイテムに対してのみ機能します。これは、スタイルが常に1つの親しか持てないために位置が変わるときに起こることが分かります。しかし、誰もがx:Shared属性で変更できると言います。たぶん私は何かを逃した、私はそれが動作しない理由を知らない。 – Panthesilea

答えて

3

あなたはほぼそこにいます!

まず第一に:あなたはImageコントロールにアイコンのプロパティを設定している場合Template vs Style.

によって混同されていない、唯一のコピーが作成されます。コントロールは親を1つしか持てないため、再割り当てするたびに前の親から削除されます。

そのため、アイコンが1つしか表示されません。代わり

  • 使用するDataTemplate、及び(あなたが達成しようとしたものを)共有画像成分とスタイルを使用したMenuItem
  • の全体のテンプレートを再定義:

    は、あなたが望むもののために2つのソリューションを持っています

この例では、唯一のエラーは、スタイル全体ではなく、ImageリソースでShared属性がfalseになることです。これはうまくいくはずです:

<Window.Resources> 
    <Image x:Key="MenuIconImage" x:Shared="false" Source="{Binding IconSource}"/> 

    <Style TargetType="{x:Type MenuItem}" x:Key="MenuItemStyle" BasedOn="{StaticResource {x:Type MenuItem}}"> 
     <Setter Property="Icon" Value="{StaticResource MenuIconImage}"> 
     </Setter> 
    </Style> 
</Window.Resources> 

希望します。

+0

ありがとう!私は共有画像コンポーネントを試して、それは動作します:) – Panthesilea

関連する問題