【转】WPF 单选的Checkbox

今天同事要在DataGrid里用单选的Checkbox,我感觉很多余,因为正常DataGrid就可以单选,为什么还要加一列Checkbox,但是人家要求再那里,我就告诉他,可以用RadioButton,然后写个Checkbox的样式就可以了。

因为本人不太会写样式,因此在网上搜到了前辈的一篇帖子,拿来应用,效果着实不错,感谢法的空间大神

RadioButton页面的XAML代码

<RadioButton x:Class="CheckBoxRadioButton.SingleCheckBox"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d" Style="{DynamicResource SingleCheckBox}" Click="RadioButton_Click_1" Unchecked="RadioButton_Unchecked_1">
        <RadioButton.Resources>
            <Style x:Key="RadioButtonFocusVisual">
                <Setter Property="Control.Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <Border>
                                <Rectangle
            Margin="15,0,0,0"
            StrokeThickness="1"
            Stroke="#60000000"
            StrokeDashArray="1 2"/>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
            <SolidColorBrush x:Key="DisabledForegroundBrush" Color="#888" />
            <SolidColorBrush x:Key="DisabledBorderBrush" Color="#AAA" />
            <SolidColorBrush x:Key="DisabledBackgroundBrush" Color="#EEE" />
            <SolidColorBrush x:Key="Normalborderbrush" Color="#5d7fad" />
            <Style x:Key="SingleCheckBox"  TargetType="{x:Type RadioButton}">
                <Setter Property="GroupName" Value="Single"/>
                <Setter Property="SnapsToDevicePixels" Value="true"/>
                <Setter Property="OverridesDefaultStyle" Value="true"/>
                <Setter Property="Foreground" Value="#071f3b"/>
                <Setter Property="FontFamily" Value="Arial"></Setter>
                <Setter Property="FontSize" Value="14"></Setter>
                <Setter Property="FocusVisualStyle"    Value="{StaticResource RadioButtonFocusVisual}"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type RadioButton}">
                            <BulletDecorator Background="Transparent">
                                <BulletDecorator.Bullet>
                                    <Border x:Name="Border"  Width="20" Height="20" CornerRadius="4" Background="#ffffff" BorderThickness="1" BorderBrush="{StaticResource Normalborderbrush}">
                                        <Path Width="14" Height="11" Margin="5,2,0,0" x:Name="CheckMark" SnapsToDevicePixels="False" Stroke="#173e78" StrokeThickness="2" Data="M 0 5 L 3 10 10 0" />
                                    </Border>
                                </BulletDecorator.Bullet>
                                <ContentPresenter
            Margin="4,0,0,0"
            VerticalAlignment="Center"
            HorizontalAlignment="Left"
            RecognizesAccessKey="True"/>
                            </BulletDecorator>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsChecked" Value="false">
                                    <Setter TargetName="CheckMark" Property="Visibility" Value="Collapsed"/>
                                </Trigger>
                                <Trigger Property="IsChecked" Value="{x:Null}">
                                    <Setter TargetName="CheckMark" Property="Data" Value="M 0 7 L 7 0" />
                                </Trigger>
                                <Trigger Property="IsMouseOver" Value="true">
                                    <Setter TargetName="Border" Property="Background" Value="#ffffff" />
                                </Trigger>
                                <Trigger Property="IsPressed" Value="true">
                                    <Setter TargetName="Border" Property="Background" Value="#ffffff" />
                                </Trigger>
                                <Trigger Property="IsEnabled" Value="false">
                                    <Setter TargetName="Border" Property="Background" Value="{StaticResource DisabledBackgroundBrush}" />
                                    <Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource DisabledBorderBrush}" />
                                    <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </RadioButton.Resources>
    </RadioButton>

RadioButton页面的CS代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace CheckBoxRadioButton
{
    /// <summary>
    /// SingleCheckBox.xaml 的交互逻辑
    /// </summary>
    public partial class SingleCheckBox : RadioButton
    {
        public SingleCheckBox()
        {
            InitializeComponent();
        }

        private bool hasCheck;
        public bool HasCheck
        {
            get { return hasCheck; }
            set { hasCheck = value; }
        }

        private void RadioButton_Click_1(object sender, RoutedEventArgs e)
        {
            if (this.HasCheck == false)
            {
                this.HasCheck = true;
                this.IsChecked = true;
            }
            else
            {
                this.HasCheck = false;
                this.IsChecked = false;
            }
        }

        private void RadioButton_Unchecked_1(object sender, RoutedEventArgs e)
        {
            this.HasCheck = false;
        }
    }
}

主页面调用

<Window x:Class="CheckBoxRadioButton.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:CheckBoxRadioButton"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel Orientation="Vertical">
            <local:SingleCheckBox Content="我是一"/>
            <local:SingleCheckBox Content="我是二"/>
        </StackPanel>
    </Grid>
</Window>

效果

时间: 2024-10-10 00:32:06

【转】WPF 单选的Checkbox的相关文章

WPF中的CheckBox的_ (underscore / 下划线)丢失

今天在项目中遇到check box的Content的内容缺少'_', 原因是WPF的ContentPresenter默认会把'_'作为加速键的转义字符. 比如CheckBox的content为"_IsEnable", 实际结果: 显示为"IsEnable": 当你按键"i"时,会触发Click事件,就可以快速的选中或者取消选中. 如果想要显示'_', 可以将控件内部的ContentPresenter的RecognizesAccessKey设置为&

WPF学习之深入浅出话模板

图形用户界面应用程序较之控制台界面应用程序最大的好处就是界面友好.数据显示直观.CUI程序中数据只能以文本的形式线性显示,GUI程序则允许数据以文本.列表.图形等多种形式立体显示. 用户体验在GUI程序设计中起着举足轻重的作用-----用户界面设计成什么样看上去才足够的漂亮?控件如何安排才简单易用并且少犯错误?这些都是设计师需要考虑的问题.WPF系统不但支持传统的Winfrom编程的用户界面和用户体验设计,更支持使用专门的设计工具Blend进行专业设计,同时还推出了以模板为核心的新一代设计理念.

RadioButton与CheckBox

笔者长期从事于数据库的开发,算了,不提当年了,因为一直用的是小语种(PowerBuilder),还是来说说这两个最常见的控件吧! RadioButton(单选)和CheckBox(多选) 先来看看继承关系吧 两个还是亲兄弟,是View的第四代传人,是View的玄孙,好小呀! RadioButton必须按组来分,而CheckBox不用,可以自由的玩耍; 这里就需要引入了圈养人RadioGroup 这里不难看出,圈养人是LinearLayout的儿子,那么就可以制定方向了 上边写RadioButto

WPF Template模版之DataTemplate与ControlTemplate【一】

WPF Template模版之DataTemplate与ControlTemplate[一] 标签: Wpf模版 2015-04-19 11:52 510人阅读 评论(0) 收藏 举报  分类: -------1.5 .NET(25)  版权声明:本文为博主郎涯工作室原创文章,未经博主允许不得转载. 目录(?)[+] WPF系统不但支持传统的Winfrom编程的用户界面和用户体验设计,更支持使用专门的设计工具Blend进行专业设计,同时还推出了以模板为核心的新一代设计理念. 1. 模板的内涵 作

Android学习笔记:常用控件 RadioGroup和CheckBox

RadioGroup和CheckBox是android的常用控件,本文自做简单介绍和学习笔记,所以所用的控件样式选用android默认的样式. 先看下代码实现的效果图 图中,上面两个(male和female)为一个RadioGroup中的两个RadioButton,下面三个为CheckBox. 一个RadioGroup里面的内容只可单选,CheckBox可多选. 接下来是代码部分 布局文件代码activity_main.xml : <LinearLayout xmlns:android="

checkbox全选/取消全选

//checkbox全选/取消全选 $(function() { $("#checkAll").click(function() { if(this.checked){ $("input[name='cbxCommodity']").prop("checked","checked"); }else{ $("input[name='cbxCommodity']").removeAttr("check

WPF模板(一)详细介绍

原文:WPF模板(一)详细介绍 本次随笔来源于电子书,人家的讲解很好,我就不画蛇添足了. 图形用户界面应用程序较之控制台界面应用程序最大的好处就是界面友好.数据显示直观.CUI程序中数据只能以文本的形式线性显示,GUI程序则允许数据以文本.列表.图形等多种形式立体显示. 用户体验在GUI程序设计中起着举足轻重的作用-----用户界面设计成什么样看上去才足够的漂亮?控件如何安排才简单易用并且少犯错误?这些都是设计师需要考虑的问题.WPF系统不但支持传统的Winfrom编程的用户界面和用户体验设计,

Html+CSS基础之单选框和复选框

Html提供了二种选择框即单选框和复选框 语法:<input type="radio/checkbox" value="值" name="名称" checked="checked" /> type:选择框的类型,radio表示单选,checkbox表示多选. value:提交到后台的值,后台使用 name:控件名,后台可使用.注:单选框name值必须一致否则无法实现单选. checked:是否选择状态. 除了单选框

安卓一步步从基础到精通自学教程,纯实战,纯干货(五)

关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到熟悉的效果. 本系列课程是.Net程序员学习安卓开发系列课程. 下面是前四次课程列表: 程序员带你学习安卓开发,十天快速入门-安卓学习必要性 程序员带你学习安卓开发,十天快速入门-开发工具配置学习 程序员带你学习安卓开发,十天快速入-对比C#学习java语法 程序员带你学习安卓开发,十天快速入门-基