Переопределить стиль флажка MaterialDesign

#wpf #checkbox #styles #material-design #controltemplate

#wpf #флажок #стили #материал-дизайн #controltemplate

Вопрос:

Итак, у меня это CheckBox Style основано на MaterialDesignActionCheckBox :

 <Style x:Key="MaterialDesignActionAccentCheckBox2" TargetType="{x:Type CheckBox}" BasedOn="{StaticResource MaterialDesignActionCheckBox}">
   <Setter Property="Control.Template">
      <Setter.Value>
         <ControlTemplate TargetType="{x:Type CheckBox}">
            <Ellipse x:Name="ellipse"
                     Width="15"
                     Height="15"
                     Fill="#353535"/>
            <ControlTemplate.Triggers>
               <Trigger Property="IsChecked" Value="False">
                  <Setter TargetName="ellipse" Property="Visibility" Value="Collapsed"/>
               </Trigger>
               <Trigger Property="IsChecked" Value="True">
                  <Setter TargetName="ellipse" Property="Visibility" Value="Visible"/>
               </Trigger>
            </ControlTemplate.Triggers>
         </ControlTemplate>
      </Setter.Value>
   </Setter>
   <Style.Triggers>
      <Trigger Property="IsChecked" Value="True">
         <Setter Property="Background" Value="Transparent"/>
         <Setter Property="Foreground" Value="Transparent"/>
      </Trigger>
      <Trigger Property="IsChecked" Value="False">
         <Setter Property="Background" Value="Transparent"/>
         <Setter Property="BorderThickness" Value="1"/>
         <Setter Property="VerticalContentAlignment" Value="Center"/>
         <Setter Property="FontSize" Value="10"/>
      </Trigger>
   </Style.Triggers>
</Style>
 

И теперь я хотел V , чтобы знак был установлен, когда CheckBox установлен флажок, поэтому я делаю это Transparent (под IsChecked true) и помещаю Ellipse .
После того, как я добавил это ControlTemplate.Triggers , я не вижу своего Ellipse .
Все, что я хочу сделать, это показать это Ellipse внутри моего Checkbox .

Ответ №1:

Шаблоны Contol определяют внешний вид, визуальные состояния, переходы между ними и необходимые элементы управления для элемента управления. Отсутствие любого из этих компонентов приведет к неожиданному поведению. Вы можете просмотреть все необходимые части и состояния элемента управления в MSDN, например, для элемента CheckBox управления:

В вашем стиле флажков отсутствуют некоторые элементы управления и состояния, и именно поэтому он не работает. Важно отметить, что вы не можете основывать шаблон элемента управления на другом, как это возможно для стилей. Следовательно, вам придется скопировать и адаптировать существующий шаблон или создать свой собственный с нуля. Для Material Design вы можете найти стили и шаблоны на GitHub.

Хорошей новостью является то, что вам может быть намного проще достичь своей цели, поскольку некоторые части стиля по умолчанию, такие как флажок для флажка действия, могут быть переопределены.

Создайте стиль, основанный на MaterialDesignActionCheckBox стиле. Установите a PackIcon в качестве значения ToggleButtonAssist.OnContent свойства. Вы можете указать значок, который вам нравится, через Kind свойство. Вы можете взглянуть на PackIconKind перечисление, чтобы найти все доступные значки.

 <Style x:Key="EllipseMaterialDesignActionCheckBox" TargetType="{x:Type CheckBox}" BasedOn="{StaticResource MaterialDesignActionCheckBox}">
   <Setter Property="wpf:ToggleButtonAssist.OnContent">
      <Setter.Value>
         <wpf:PackIcon Kind="Circle" FlowDirection="LeftToRight" />
      </Setter.Value>
   </Setter>
</Style>
 

Вместо значка пакета вы, конечно, можете установить свой эллипс, просто замените значок пакета приведенным ниже кодом. Fill Привязка гарантирует , что к эллипсу будет применен Foreground цвет родительского CheckBox элемента .

 <Ellipse Fill="{Binding Foreground, RelativeSource={RelativeSource AncestorType={x:Type CheckBox}}}" Width="20" Height="20"/>
 

Если вы хотите изменить цвет флажка, вы можете либо применить цвет непосредственно к Fill свойству в стиле, либо добавить параметр настройки к CheckBox стилю, который задает Foreground свойство.

 <Setter Property="Foreground" Value="#353535"/>
 

Чтобы использовать стиль, ссылайтесь на него как StaticResource (или DynamicResource , если вам нужно).

 <CheckBox Style="{StaticResource EllipseMaterialDesignActionCheckBox}"/>
 

Чтобы автоматически применять стиль ко всем CheckBox элементам в области видимости, создайте неявный стиль.

 <Style TargetType="{x:Type CheckBox}" BasedOn="{StaticResource EllipseMaterialDesignActionCheckBox}"/>
 

Вот несколько скриншотов для сравнения, мои основные и второстепенные цвета DeepPurple , а Lime ваши могут отличаться. Первый флажок установлен по умолчанию, во втором используется значок пакета в виде круга (использование эллипса то же самое), а в последнем Foreground применяется ваш цвет.

Флажки в разных стилях.