如何为WPF创建锁定/解锁复选框
我有下面的款式如何为WPF创建锁定/解锁复选框,wpf,checkbox,styles,Wpf,Checkbox,Styles,我有下面的款式 <Style x:Key="LockBox" TargetType="CheckBox"> <Style.Triggers> <Trigger Property="IsChecked" Value="True"> <!-- Locked --> <Setter Property="Content" Value="🔒" />
<Style x:Key="LockBox" TargetType="CheckBox">
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<!-- Locked -->
<Setter Property="Content" Value="🔒" />
</Trigger>
<Trigger Property="IsChecked" Value="False">
<!-- Unlocked -->
<Setter Property="Content" Value="🔓" />
</Trigger>
</Style.Triggers>
</Style>
这将unicode锁定/解锁符号设置为复选框内容。然而
我想把锁定/解锁符号放在图像所在的位置。如何
这样做?这里有一个完整的控制模板示例,您可以使用它来实现目标
<ControlTemplate x:Key="CheckBoxTemplate" TargetType="{x:Type CheckBox}">
<Grid Background="{TemplateBinding Background}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="24" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid
Grid.Column="0" Grid.Row="0"
Width="24" Height="24"
VerticalAlignment="Center">
<TextBlock Text="🔒" Name="LockedIcon" Visibility="Hidden" />
<TextBlock Text="🔓" Name="UnlockedIcon" Visibility="Hidden"/>
</Grid>
<Border
x:Name="WhiteSpaceBorder"
Grid.Column="1" Grid.Row="0"
Width="8"
Visibility="Visible"/>
<ContentPresenter
Grid.Column="2" Grid.Row="0"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Margin="{TemplateBinding Padding}"
RecognizesAccessKey="True"
TextBlock.Foreground="{TemplateBinding Foreground}"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<!-- Locked -->
<Setter Property="Visibility" TargetName="LockedIcon" Value="Visible" />
</Trigger>
<Trigger Property="IsChecked" Value="False">
<!-- Unlocked -->
<Setter Property="Visibility" TargetName="UnlockedIcon" Value="Visible" />
</Trigger>
<Trigger Property="Content" Value="{x:Null}">
<Setter Property="Visibility" TargetName="WhiteSpaceBorder" Value="Collapsed"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
这是一个完整的控制模板示例,您可以使用它来实现您的目标
<ControlTemplate x:Key="CheckBoxTemplate" TargetType="{x:Type CheckBox}">
<Grid Background="{TemplateBinding Background}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="24" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid
Grid.Column="0" Grid.Row="0"
Width="24" Height="24"
VerticalAlignment="Center">
<TextBlock Text="🔒" Name="LockedIcon" Visibility="Hidden" />
<TextBlock Text="🔓" Name="UnlockedIcon" Visibility="Hidden"/>
</Grid>
<Border
x:Name="WhiteSpaceBorder"
Grid.Column="1" Grid.Row="0"
Width="8"
Visibility="Visible"/>
<ContentPresenter
Grid.Column="2" Grid.Row="0"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Margin="{TemplateBinding Padding}"
RecognizesAccessKey="True"
TextBlock.Foreground="{TemplateBinding Foreground}"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<!-- Locked -->
<Setter Property="Visibility" TargetName="LockedIcon" Value="Visible" />
</Trigger>
<Trigger Property="IsChecked" Value="False">
<!-- Unlocked -->
<Setter Property="Visibility" TargetName="UnlockedIcon" Value="Visible" />
</Trigger>
<Trigger Property="Content" Value="{x:Null}">
<Setter Property="Visibility" TargetName="WhiteSpaceBorder" Value="Collapsed"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
“图像在哪里”-您在谈论哪个图像?实际的复选标记是什么?如果是这样,您需要编辑复选框
模板,控件的这一部分将是一个切换按钮
,您需要相应地设置它的内容
。我想他希望用锁定/解锁图标替换复选标记。要达到这个目标,你必须编辑复选框ControlTemplate。@Viv实际上你是对的,我最后只使用了一个切换按钮,并在内容上使用了一个样式触发器。对于我所问的具体问题,史蒂文的回答作为参考非常有用。“图像在哪里”-你在谈论哪个图像?实际的复选标记是什么?如果是这样,您需要编辑复选框
模板,控件的这一部分将是一个切换按钮
,您需要相应地设置它的内容
。我想他希望用锁定/解锁图标替换复选标记。要达到这个目标,你必须编辑复选框ControlTemplate。@Viv实际上你是对的,我最后只使用了一个切换按钮,并在内容上使用了一个样式触发器。对于我问的具体问题,steven的回答还是很有用的。即使在这种情况下,我还是希望控制模板触发器修改文本块的文本,而不是使用两个单独的文本块切换可见性。一个是因为这样你只需要1个触发器。第二,因为它给了您一些扩展性,如果您将来有一个三态,您不需要添加另一个可见性切换到旧的触发器和回溯,只需相应地设置文本。最后,xaml元素越少越好。当触发器很好地实现时,在这里使用互斥的TextBlock
是没有意义的……这只是我的观点。即使在这种情况下,我还是希望ControlTemplate
Trigger
修改TextBlock
的文本,而不是使用两个单独的TextBlock
并切换可见性。一个是因为这样你只需要1个触发器。第二,因为它给了您一些扩展性,如果您将来有一个三态,您不需要添加另一个可见性切换到旧的触发器和回溯,只需相应地设置文本。最后,xaml元素越少越好。当触发器很好地实现时,在这里使用互斥的TextBlock
是没有意义的……这只是我的观点。