2013-05-27 23 views
0

我有以下样式如何创建一个锁定/解锁复选框WPF

<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> 

这将设置一个统一的锁定/解锁符号的复选框内容。不过 我想将锁定/解锁符号放在图像所在的位置。如何 做到这一点?

+0

“哪里的图像是” - 你在说哪个图像?实际的复选标记?如果是这样,你需要编辑'CheckBox'模板,该控件的一部分将是一个'ToggleButton',你需要相应地设置它的'Content'。 – Viv

+0

我想他希望复选标记替换为锁定/解锁图标。为了达到这个目标,你必须编辑CheckBox ControlTemplate。 –

+0

@Viv其实你是对的,我最终只是使用一个切换按钮,并在内容上使用Style触发器。对于具体的问题,我问斯蒂文的答案是相当有用的作为参考。 – bradgonesurfing

回答

2

下面是可用于实现目标的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> 
+1

即使在这种情况下,我宁愿ControlTemplate Trigger也修改TextBlock的Text,而不是使用2个独立的TextBlock,并切换可见性。一个因为这样你只需要1个'触发器'。其次,因为它给了你一些可扩展性,如果将来你有一个三态,你不需要添加另一个'可见性'切换旧的'触发器'和回溯,但相应地设置'文本'。最后,较小的xaml元素越好。没有意义的是,当触发器达到它的罚款时,在这里有一个互斥的“TextBlock”......只是我的意见。 – Viv