2012-03-25 4 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 ... почему бы вам просто не использовать RadioButton в ItemContainerStyle?

<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 в том же окне, всеRadioButtons будут взаимоисключающими, потому что они будут одни и те же GroupName. См. this article для обходного пути.

+0

Спасибо, что исправляет мою конкретную проблему - мне больше не нужно ссылаться на конкретную тему. Кроме того, поскольку элементы эффективно сгруппированы по списку, GroupName не требуется, поэтому, насколько я могу судить, нет никаких проблем, но я устанавливаю GroupName = "{x: Null}" для обеспечения безопасности в любом случае. Я полагаю, что более общий вопрос: «Если мне нужно явно использовать хром в элементе управления, мне нужно ссылаться на тему?» нужен отдельный вопрос. – Phil

+0

@Phil, GroupName * требуется *, потому что RadioButtons не находятся непосредственно в одной панели. Я знаю, потому что я попробовал, прежде чем отправил свой ответ;). –

+0

Извините, но я собираюсь не принимать этот ответ (надеюсь, временно). При использовании RadioButton вместо BulletDecorator выбранная привязка элемента одобрена при использовании клавиатуры, но не работает при использовании мыши. – Phil

Смежные вопросы