2013-03-15 2 views
1

Я пытаюсь настроить мои ToggleButtons, чтобы при проверке они сказали «Да» зеленым, а когда не отмечены, скажите «Нет» красным.ToggleButton Style работает только на последнем ToggleButton

Я создал следующий стиль, который находится в моем словаре ресурсов Styles.

<!-- ToggleButtons --> 
<Style x:Key="YesNoToggleStyle" TargetType="ToggleButton"> 
    <Style.Triggers> 
    <Trigger Property="IsChecked" Value="True"> 
     <Setter Property="Background" Value="SpringGreen" /> 
     <Setter Property="Content"> 
     <Setter.Value> 
      <TextBlock Text="Yes"/> 
     </Setter.Value> 
     </Setter> 
    </Trigger> 
    <Trigger Property="IsChecked" Value="False"> 
     <Setter Property="Background" Value="Crimson" /> 
     <Setter Property="Content"> 
     <Setter.Value> 
      <TextBlock Text="No"/> 
     </Setter.Value> 
     </Setter> 
    </Trigger> 
    </Style.Triggers> 
</Style> 

Это работает ... отчасти. Если ToggleButton является последним из любого значения, он отображается правильно. Все предыдущие кнопки с одинаковым значением пустые. Высота также уменьшалась, но я исправил это с помощью Set 'Height' выше триггеров. Чтобы проиллюстрировать это, когда новая запись создается она выглядит следующим образом:

Startup toggle buttons и после того, как я нажал на кнопки 1, 2 и 3 и 1 раз: edited toggle buttons

я изначально имел стиль отсчитываются от окружающих сетка:

<Grid> 
    ... 
    <Grid.Resources> 
     <Style BasedOn="{StaticResource YesNoToggleStyle}" TargetType="{x:Type ToggleButton}" /> 
    </Grid.Resources> 

Но изменения, которые так каждый ToggleButton ссылается на стиль индивидуально (<ToggleButton Style="{StaticResource YesNoToggleStyle}" ... />) не сделал разницу.

Я посмотрел Customizing the toggle state of a toggle button in wpf и Override ToggleButton Style, где эффект один и тот же, но они говорят о внешних изображениях, а мои проблемы - внутри wpf.

Я также посмотрел на второй ответ: i want to change backcolor of toggle button when toggle button ischecked and viceversa in WPF а) у меня только смесь + SketchFlow предварительного просмотра, который поставляется с VS2012, и б) я в общей сложности нуб с смесью и не могу получить от Select the "Checked State" до Reset the Background Color инструкции в ответе (плюс я был бы удивлен, если для этой задачи требуется инструмент blend).

Может ли кто-нибудь показать мне, что делать, чтобы получить несколько ToggleButtons, чтобы использовать тот же стиль правильно?

ответ

1

Это работает для меня. Где-то в Dictionary1.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Style x:Key="YesNoToggleStyle" TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource {x:Static ToolBar.ToggleButtonStyleKey}}"> 
     <Style.Triggers> 
      <Trigger Property="IsChecked" Value="False"> 
       <Setter Property="Background" Value="Crimson" /> 
       <Setter Property="Content" Value="No"/> 
      </Trigger> 
      <Trigger Property="IsChecked" Value="True"> 
       <Setter Property="Background" Value="SpringGreen" /> 
       <Setter Property="Content" Value="Yes"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</ResourceDictionary> 

Обратите внимание, что стиль основан на ToolBar.ToggleButtonStyle.

<Grid> 
    <Grid.Resources> 
     <ResourceDictionary Source="pack://application:,,,/Dictionary1.xaml"/> 
    </Grid.Resources> 

    <ItemsControl ItemContainerStyle="{StaticResource YesNoToggleStyle}"> 
     <ToggleButton /> 
     <ToggleButton /> 
     <ToggleButton /> 
    </ItemsControl> 
</Grid> 
+0

спасибо. Это делает работу. Несколько вопросов, если я могу: есть ли решение, отличное от ToolBar (мне нравится эффект нажатия кнопки с standth ToggleButton)? Кроме того, почему моя попытка не работает, что я делаю неправильно? – mcalex

+0

@mcalex: ваш код выглядит нормально. Мне кажется, проблема в шаблоне управления ToggleButton.Я бы рассмотрел этот шаблон и стиль, определенный в ToolBar, чтобы сравнить их. Обратите внимание: этот стиль не будет применяться, если кнопки переключения будут помещены в сетку напрямую, а не элементы управления - это определенно причина для поиска шаблона управления. – Dennis

1

попытки заменить Content свойства ContentTemplate:

<Setter Property="ContentTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <TextBlock Text="Yes"/> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
0

В моем случае я хотел бы иметь «Locked» ToggleButton в общей библиотеке DLL, определенной и использовать повторно через мое приложение. Вот мой результат, который сработал для меня. Может быть, кто-то будет полезно (поставить это в Resourcedictionary.xaml):

<BitmapImage x:Key="LockedLock" 
       UriSource="/...;component/Resources/Lock_closed_16p.png" /> 
<BitmapImage x:Key="OpenLock" 
       UriSource="/...;component/Resources/Lock_open_16p.png" /> 

<Style x:Key="LockButton" 
     TargetType="ToggleButton"> 
    <Setter Property="ContentTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <Image Source="{DynamicResource OpenLock }" 
         Width="12" 
         Height="12" 
         Name="contentimage" /> 
       <DataTemplate.Triggers> 
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ToggleButton , AncestorLevel=1, Mode=FindAncestor }, Path=IsChecked}" 
           Value="True"> 
         <Setter Property="Image.Source" 
           TargetName="contentimage" 
           Value="{DynamicResource LockedLock }" /> 
        </DataTrigger> 
       </DataTemplate.Triggers> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Кредиты на:

Setting Button's Content to <Image> via Styles

Setter Target Name not recognized

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