wpf - WPF 中的复选框模板

标签 wpf templates checkbox

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

最佳答案

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

关于wpf - WPF 中的复选框模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5564497/

相关文章:

c# - WPF DataGrid 插入和更新绑定(bind)

c# - 如何在 WPF 中使用 XNA?

c# - 重新排序数据网格的列后如何获得新的列顺序?

c++ - 在 C++ 中提取另一个泛型类型的泛型类型

c++ - 模板多态性可以用来代替 OO 多态性吗?

php - 使用带有复选框数组的 javascript 函数

c# - 如何根据单元格值更改 DataGrid 单元格背景颜色

c++ - 模板参数推导/变量模板 : how can I make it work?

jquery - 为什么复选框不起作用?

ruby-on-rails - 在 erb - rails 中保存复选框值