2011-04-06 95 views
2

我遇到了我正在開發的應用程序中的一種情況。我想寫一個複選框的模板,我應該只能禁用刻度框並保持標籤的啓用。這真的可能嗎?我想出了一個模板,但是當我禁用複選框時,標籤和刻度標記都被禁用。WPF中的複選框模板

回答

2

只是看看此XAML

<Window x:Class="WpfApplication1.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300" > 
<Window.Resources> 
    <Style x:Key="CheckBoxFocusVisual"> 
     <Setter Property="Control.Template"> 
      <Setter.Value> 
       <ControlTemplate> 
        <Border> 
         <Rectangle Margin="15,0,0,0" Stroke="#60000000" StrokeThickness="1" StrokeDashArray="1 2"/> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
    <!-- PressedBrush is used for Pressed in Button, Radio Button, CheckBox --> 
    <LinearGradientBrush x:Key="PressedBrush" EndPoint="0,1" StartPoint="0,0"> 
     <GradientStop Color="#BBB" Offset="0.0"/> 
     <GradientStop Color="#EEE" Offset="0.1"/> 
     <GradientStop Color="#EEE" Offset="0.9"/> 
     <GradientStop Color="#FFF" Offset="1.0"/> 
    </LinearGradientBrush> 
    <LinearGradientBrush x:Key="PressedBorderBrush" EndPoint="0,1" StartPoint="0,0"> 
     <GradientStop Color="#444" Offset="0.0"/> 
     <GradientStop Color="#888" Offset="1.0"/> 
    </LinearGradientBrush> 
    <LinearGradientBrush x:Key="NormalBrush" EndPoint="0,1" StartPoint="0,0"> 
     <GradientStop Color="#EEE" Offset="0.0"/> 
     <GradientStop Color="#CCC" Offset="1.0"/> 
    </LinearGradientBrush> 
    <SolidColorBrush x:Key="GlyphBrush" Color="#444"/> 
    <LinearGradientBrush x:Key="NormalBorderBrush" EndPoint="0,1" StartPoint="0,0"> 
     <GradientStop Color="#CCC" Offset="0.0"/> 
     <GradientStop Color="#444" Offset="1.0"/> 
    </LinearGradientBrush> 
    <LinearGradientBrush x:Key="MouseOverBrush" EndPoint="0,1" StartPoint="0,0"> 
     <GradientStop Color="#FFF" Offset="0.0"/> 
     <GradientStop Color="#AAA" Offset="1.0"/> 
    </LinearGradientBrush> 
    <!-- Simple CheckBox --> 
    <Style x:Key="CheckBoxStyle1" TargetType="{x:Type CheckBox}"> 
     <Setter Property="SnapsToDevicePixels" Value="true"/> 
     <Setter Property="FocusVisualStyle" Value="{DynamicResource CheckBoxFocusVisual}"/> 
     <Setter Property="Background" Value="{DynamicResource NormalBrush}"/> 
     <Setter Property="BorderBrush" Value="{DynamicResource NormalBorderBrush}"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type CheckBox}"> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="Auto"></ColumnDefinition> 
          <ColumnDefinition></ColumnDefinition> 
         </Grid.ColumnDefinitions> 
         <!-- BulletDecorator is used to provide baseline alignment between the checkmark and the Content --> 
         <BulletDecorator x:Name="test" Grid.Column="0"> 
          <BulletDecorator.Bullet> 
           <Grid Width="13" Height="13"> 
            <Border x:Name="Border" 
           Background="{TemplateBinding Background}" 
           BorderBrush="{TemplateBinding BorderBrush}" 
           BorderThickness="{TemplateBinding BorderThickness}"/> 
            <Path x:Name="CheckMark" Stroke="{DynamicResource GlyphBrush}" 
           StrokeThickness="2" 
           SnapsToDevicePixels="False" Data="M 0 0 L 13 13 M 0 13 L 13 0"/> 
           </Grid> 
          </BulletDecorator.Bullet> 
         </BulletDecorator> 
         <ContentPresenter Grid.Column="1" 
        HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
        Margin="{TemplateBinding Padding}" 
        VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
        RecognizesAccessKey="True"/> 

        </Grid> 
        <!-- This uses Visibility to hide and show the CheckMark on IsChecked --> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsChecked" Value="false"> 
          <Setter Property="Visibility" Value="Collapsed" TargetName="CheckMark"/> 
         </Trigger> 
         <Trigger Property="IsMouseOver" Value="true"> 
          <Setter Property="Background" Value="{DynamicResource MouseOverBrush}" TargetName="Border"/> 
         </Trigger> 
         <Trigger Property="IsPressed" Value="true"> 
          <Setter Property="Background" Value="{DynamicResource PressedBrush}" TargetName="Border"/> 
          <Setter Property="BorderBrush" Value="{DynamicResource PressedBorderBrush}" TargetName="Border"/> 
         </Trigger> 
         <Trigger Property="IsEnabled" Value="false"> 
          <Setter Property="Background" Value="gray" TargetName="Border"/> 
          <Setter Property="BorderBrush" Value="black" TargetName="Border"/> 
         </Trigger> 

        </ControlTemplate.Triggers> 

       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

</Window.Resources> 

<Grid x:Name="LayoutRoot"> 
    <CheckBox HorizontalAlignment="Left" 
    Margin="0,5,0,0" Style="{DynamicResource CheckBoxStyle1}" 
    VerticalAlignment="Top" Width="182" Height="17" 
    Content="Disabled" IsEnabled="False" IsChecked="True" /> 
    <CheckBox HorizontalAlignment="Left" 
    Margin="125,5,0,0" Style="{DynamicResource CheckBoxStyle1}" 
    VerticalAlignment="Top" Width="182" Height="17" 
    Content="Active" IsEnabled="true" /> 
</Grid> 

+0

這工作正是我想要的方式...非常感謝Kishore ... :))@ Kishore – Anee 2011-04-06 12:01:33

0

我有同樣的問題,並有相當愚蠢的方案上來:

<StackPanel Orientation="Vertical" > 
     <TextBlock Text="Set Global Edition" TextWrapping="Wrap" HorizontalAlignment="Center" /> 
     <CheckBox x:Name="GlobalEdition" IsChecked="{Binding IsGlobal}" HorizontalAlignment="Center" /> 
</StackPanel> 

由於TextBlock的&複選框被分開,改變複選框的狀態不會影響連接到它的文本。

(如果我記得很清楚,一個文本框不改變其外觀,如果禁用,也許你可以用一個文本框,而不是一個標籤試試)

+0

嗯,我試着用文本框,也沒有運氣。我實際上正在爲它編寫一個模板,當禁用複選框時,整個事件都會被禁用。@ Damascus – Anee 2011-04-06 10:30:53

+0

您是否將文本框放入複選框?因爲這可能是問題所在,如果這是複選框,它將無可否認地與框的狀態相關聯(這實際上是爲什麼我將兩個單獨的控件放在StackPanel中,而不是在checkBox中添加一個textBlock,正如您剛剛看到的那樣,不起作用) – Damascus 2011-04-06 10:52:21

+0

在模板中,我再次放置了文本框和複選框。 @Damascus – Anee 2011-04-06 11:02:14