2012-03-25 6 views
0

私はラジオボタングループのように見えるようにリストボックスをスタイリングするよく知られた手法を使用しています。 スタイルは、リスト内の各アイテムに対してBulletDecoratorを表示します。これを行うには、PresentationFramework.Aero.dllなどの特定のテーマアセンブリを参照し、明示的にそれを自分のスタイルで使用する必要があります。私は明示的なテーマを参照する必要がないように現在のテーマを使用してBulletDecoratorを作成することはできますか?

xmlns:theme="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" 

<BulletDecorator.Bullet> 
    <theme:BulletChrome 
     Background="{TemplateBinding Control.Background}" 
     BorderBrush="{TemplateBinding Control.BorderBrush}" 
     IsRound="True" 
     RenderMouseOver="{TemplateBinding UIElement.IsMouseOver}" 
     IsChecked="{TemplateBinding ListBoxItem.IsSelected}" /> 
</BulletDecorator.Bullet> 

現在またはデフォルトのテーマを使用してスタイル設定されBulletDecoratorを作成する方法は、ありますか?

答えて

1

RadioButtonテンプレートを再作成する必要はありません... ItemContainerStyleにはRadioButtonを使用してください。

このアプローチには問題があることを
<Style x:Key="RadioButtonGroup" TargetType="ListBox"> 
    <Setter Property="ItemContainerStyle"> 
    <Setter.Value> 
     <Style TargetType="ListBoxItem"> 
     <Setter Property="Template"> 
      <Setter.Value> 
      <ControlTemplate TargetType="ListBoxItem"> 
       <RadioButton IsChecked="{TemplateBinding IsSelected}" Content="{TemplateBinding Content}" GroupName="ListBoxItems" /> 
      </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     </Style> 
    </Setter.Value> 
    </Setter> 
</Style> 

注:あなたは、同じウィンドウ内に複数のListBoxesために、このスタイルを使用する場合、彼らは同じGroupNameを共有するため、はすべてRadioButtonsは、相互に排他的になります。回避策は、this articleを参照してください。

+0

私の特定の問題を修正しました。特定のテーマをこれ以上参照する必要はありません。また、リストボックスによって項目が効果的にグループ化されるので、GroupNameは必要ないので、私には分かりませんが、GroupName = "{x:Null}"を設定しています。 「コントロールでクロムを明示的に使用する必要がある場合は、テーマを参照する必要がありますか」というより一般的な質問があると思います。別の質問が必要です。 – Phil

+0

@Phil RadioButtonsは同じパネルに直接存在しないため、GroupName *は必須です。私は自分の答えを投稿する前に試したので知っている;)。 –

+0

申し訳ありませんが、私はこの回答を受け入れることはできません(うまくいけば一時的に)。 BulletDecoratorの代わりにRadioButtonを使用する場合、選択した項目のバインドはキーボードを使用するときは正常ですが、マウスを使用するときは機能しません。 – Phil

関連する問題