【问题标题】:Checkbox template in WPFWPF中的复选框模板
【发布时间】:2011-04-06 19:55:24
【问题描述】:

我在正在开发的应用程序中遇到了一种情况。我想为一个复选框编写一个模板,我应该能够只禁用勾选标记框并保持标签启用。这真的可以吗。我想出了一个模板,但是当我禁用复选框时,标签和刻度线都被禁用了。

【问题讨论】:

    标签: wpf templates checkbox


    【解决方案1】:

    看看这个 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>
    

    【讨论】:

    • 这正是我想要的方式...非常感谢 Kishore...:)@Kishore
    【解决方案2】:

    我遇到了同样的问题并想出了一个非常愚蠢的解决方案:

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

    由于 TextBlock 和 Checkbox 是分开的,因此更改 Checkbox 状态不会影响附加到它的文本。

    (如果我没记错的话,如果禁用 Textbox 并不会改变其外观,也许你可以尝试使用 TextBox 而不是标签)

    【讨论】:

    • 好吧,我尝试了一个文本框,但也没有运气。我实际上正在为它编写一个模板,当禁用复选框时,整个事情都会被禁用。@Damascus
    • 你把文本框放在Checkbox里了吗?因为这可能是问题所在,如果它在 Checkbox 内,它将无可否认地链接到框的状态(这实际上就是为什么我将两个单独的控件放在 StackPanel 中,而不是在 checkBox 中添加一个 textBlock ,正如你刚才看到的那样,那样不行)
    • 在模板中,我再次放置了文本框和复选框。 @大马士革
    • 好吧,如果你声明一个内容展示器而不是文本框,并将内容属性与复选框的内容属性绑定,你就可以完成任务。上面提供的答案将帮助您更多地了解这一点。谢谢大家回复@Damascus,@Kishore Kumar
    • 上面的代码只是给了我一个提示,让我找到解决问题的方法。解决方案很简单。只需将模板中的文本框替换为 contentPresenter。我认为这个解决方案很简单。:)@Damascus
    猜你喜欢
    • 2013-07-12
    • 2015-05-02
    • 2014-10-15
    • 2010-09-24
    • 2016-12-04
    • 2013-07-22
    • 1970-01-01
    • 2011-07-08
    • 2016-12-18
    相关资源
    最近更新 更多