Я пытаюсь создать скользящую кнопку включения-выключения для шаблона элемента управления CheckBox.Я решил использовать элемент управления Slider, поскольку он уже обеспечивает базовую необходимую функциональность.На данный момент я создал шаблон с ползунком в нем и связал значение ползунка со свойством ischecked для TemplatedParent, используя ValueConverter.
Пока что ControlTemplate работает, как и ожидалось, при перетаскивании ползунка с помощьюмыши или щелкнув по треку.Однако, если я нажимаю на большой палец, я хочу, чтобы ползунок тоже изменил значение, как и следовало ожидать от обычного флажка.
Если я отключил HitTestVisibility ползунка и поместил прозрачный прямоугольник поверх него, элемент управления работает какнормальный флажок - нажатие переключает состояние IsChecked.Но с этим я теряю возможность сдвинуть его в нужное состояние.
Я также пытался использовать DataTriggers, чтобы установить ползунок в состояние IsChecked вместо привязки данных:
<ControlTemplate.Triggers>
<Setter TargetName="ControlSlider" Property="Value" Value="0"/>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="ControlSlider" Property="Value" Value="1"/>
</Trigger>
</ControlTemplate.Triggers>
Этоработал с подходом «Нет HitTestVisibility», упомянутым выше, но он ничего не делает, когда я использую функцию ползунка.
Это мой шаблон и флажок:
<ControlTemplate x:Key="OnOffSlider" TargetType="{x:Type CheckBox}">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Center">
<Grid Width="Auto" VerticalAlignment="Center">
<Slider x:Name="ControlSlider" Maximum="1" Minimum="0" IsEnabled="True" IsHitTestVisible="True" Width="30" TickFrequency="1" IsSnapToTickEnabled="True" Value="{Binding IsChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay, Converter={StaticResource BooleanConverter}}">
</Slider>
</Grid>
<ContentPresenter Margin="10,0,0,0" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" ContentTemplate="{TemplateBinding ContentTemplate}" RecognizesAccessKey="True" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</StackPanel>
</ControlTemplate>
<CheckBox>
<CheckBox.Style>
<Style TargetType="CheckBox">
<Setter Property="Template" Value="{StaticResource OnOffSlider}"/>
</Style>
</CheckBox.Style>
</CheckBox>
И ValueConverter:
public class BooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool)
{
return ((bool)value) ? 1 : 0;
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is double)
{
return ((double)value >= 0.5) ? true : false;
}
return null;
}
}
Я хочу, чтобы кнопка выполняла функцию ползунка только с состояниями (0 и 1) при перетаскивании большого пальца, но переключала ее состояние всякий раз, когда я просто нажимала на нее.Это возможно только в xaml.Если да, как я могу убедиться, что событие Click меняет свое состояние должным образом?