如何为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="&#x1f512;" />

我有下面的款式

<Style x:Key="LockBox" TargetType="CheckBox">
    <Style.Triggers>
        <Trigger Property="IsChecked" Value="True">
            <!-- Locked -->
            <Setter Property="Content" Value="&#x1f512;" />
        </Trigger>
        <Trigger Property="IsChecked" Value="False">
            <!-- Unlocked -->
            <Setter Property="Content" Value="&#x1f513;" />
        </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="&#x1f512;" Name="LockedIcon" Visibility="Hidden" />
            <TextBlock Text="&#x1f513;" 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="&#x1f512;" Name="LockedIcon" Visibility="Hidden" />
            <TextBlock Text="&#x1f513;" 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
是没有意义的……这只是我的观点。