2013-05-27 40 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