WPF 自定义属性和触发器

原创 2015年07月07日 16:01:19
public class MEFACheckBox : CheckBox
    {

        //public enum CheckBoxSatus
        //{
        //    [Description("无")]
        //     None=-1,
        //    [Description("错")]
        //    error=0,
        //    [Description("对")]
        //    correct=1,
        //}
        public MEFACheckBox()
        {
            base.DefaultStyleKey = typeof(MEFACheckBox);
            base.IsThreeState = false;
            this.Click += MEFACheckBox_Click;
            CheckValue = "None";

        }
        public string CheckValue
        {
            get { return (string)GetValue(CheckValueProperty); }
            set { SetValue(CheckValueProperty, value); }
        }
        public static readonly DependencyProperty CheckValueProperty =
            DependencyProperty.Register("CheckValue", typeof(string), typeof(MEFACheckBox), <span style="color:#ff6666;">new UIPropertyMetadata("")</span>);
//这句话很重要不然触发器没用。
        static MEFACheckBox()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(MEFACheckBox), new FrameworkPropertyMetadata(typeof(MEFACheckBox)));

        }
        private void MEFACheckBox_Click(object sender, RoutedEventArgs e)
        {


            switch (CheckValue)
            {
                //空--对
                case "None":
                    CheckValue = "correct";
                    break;
                //错--空
                case "error":
                    CheckValue = "None";
                    break;
                //对--错
                case "correct":
                    CheckValue = "error";
                    break;
                default:
                    break;

            }
        }

    }
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:l="clr-namespace:MEFA.Controls">
    <Style x:Key="MyButton1" TargetType="{x:Type CheckBox}">
        <!--<Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="CheckBox">
                    <DockPanel>
                        <ContentPresenter DockPanel.Dock="Left" VerticalAlignment="Center" />
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="40"/>


                            </Grid.ColumnDefinitions>
                            <Rectangle Grid.Column="0" Grid.ColumnSpan="1" />
                            <TextBlock x:Name="txtBox"   />
                        </Grid>
                    </DockPanel>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsChecked" Value="True">
                            <Setter TargetName="txtBox" Property="Grid.Column" Value="0"/>
                            <Setter TargetName="txtBox" Property="Text" Value="  ( √ ) "/>


                        </Trigger>
                        <Trigger Property="IsChecked" Value="{x:Null}">
                            <Setter TargetName="txtBox" Property="Grid.Column" Value="0"/>
                        </Trigger>
                        <Trigger Property="IsChecked" Value="false">
                            <Setter TargetName="txtBox" Property="Grid.Column" Value="0"/>
                            <Setter TargetName="txtBox" Property="Text" Value="  (   ) "/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>-->
    </Style>
    <Style    TargetType="{x:Type l:MEFACheckBox}" BasedOn="{StaticResource MyButton1}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type l:MEFACheckBox}">
                    <DockPanel x:Name="ss">
                        <ContentPresenter DockPanel.Dock="Left" VerticalAlignment="Center"  />
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="15"/>
                                <ColumnDefinition Width="10"/>
                                <ColumnDefinition Width="8"/>
                            </Grid.ColumnDefinitions>
                            <TextBlock x:Name="txtBoxl" Text=" ( "  Grid.Column="0" Grid.ColumnSpan="1"/>
                            <Rectangle Grid.Column="1" Grid.ColumnSpan="1" />
                            <TextBlock x:Name="txtBox" Width="10"   />
                            <TextBlock x:Name="txtBoxr" Text=")" Grid.Column="2" Grid.ColumnSpan="1" />


                        </Grid>
                    </DockPanel>
                    <ControlTemplate.Triggers>
                        <!--<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=CheckValue}" Value="1">
                            <Setter TargetName="txtBox" Property="Grid.Column" Value="1"/>
                            <Setter TargetName="txtBox" Property="Text" Value=" "/>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=CheckValue}" Value="-1">
                            <Setter TargetName="txtBox" Property="Grid.Column" Value="1"/>
                            <Setter TargetName="txtBox" Property="Text" Value="×"/>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=CheckValue}" Value="0">
                            <Setter TargetName="txtBox" Property="Grid.Column" Value="1"/>
                            <Setter TargetName="txtBox" Property="Text" Value="√"/>
                        </DataTrigger>
                        <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Foreground" Value="Red"/>
                        </Trigger>
                        <Trigger Property="IsFocused" Value="True">
                            <Setter Property="Foreground" Value="Red"/>
                        </Trigger>-->
                        <Trigger Property="CheckValue" Value="None">
                            <Setter TargetName="txtBox" Property="Grid.Column" Value="1"/>
                          
                            <Setter TargetName="txtBox" Property="Text" Value=" "/>
                        </Trigger>
                        <Trigger Property="CheckValue" Value="correct">
                            <Setter TargetName="txtBox" Property="Grid.Column" Value="1"/>
                            <Setter TargetName="txtBox" Property="Text" Value="√"/>
                        </Trigger>
                        <Trigger  Property="CheckValue" Value="error">
                            <Setter TargetName="txtBox" Property="Grid.Column" Value="1"/>
                            <Setter TargetName="txtBox" Property="Text" Value="×"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

WPF中的触发器简单总结

触发器,从某种意义上来说它也是一种Style,因为它包含有一个Setter集合,并根据一个或多个条件执行Setter中的属性改变。因为复用的缘故,Styles是放置触发器的最好位置。但对于每个Fram...
  • minsenwu
  • minsenwu
  • 2012年12月12日 09:54
  • 1002

WPF如何使用触发器

1.WPF如何实现下面的功能 2.下面就是利用属性触发器实现
  • sinat_32124195
  • sinat_32124195
  • 2015年11月02日 20:29
  • 1333

WPF的触发器

我们不仅可以在代码中通过设置属性值来更改控件的外观,还可以在程序运行的过程中动态的改变控件的外观。例如,用户在按钮上移动鼠标,按钮就会改变其外观。通常,这必须在C#代码中实现。但是,使用WPF,我们可...
  • u011416044
  • u011416044
  • 2013年10月12日 15:39
  • 1314

WPF 自定义控件依赖属性怎么实时变化?

WPF自定义控件依赖属性怎么实时变化。
  • lvguoshan
  • lvguoshan
  • 2015年08月21日 16:01
  • 2729

WPF中的datatrigger

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    xmlns:x="http://schemas.mic...
  • cleverwyq
  • cleverwyq
  • 2007年05月16日 10:16
  • 6126

WPF动画特效以及计时器和触发器

1.先贴几张效果图 首先,我们来看看动画特效的效果截图: 接下来是按钮Button的效果 2.要学到的知识 主要是两方面的东西: ...
  • james362569870
  • james362569870
  • 2013年11月18日 22:40
  • 2775

WPF:属性触发器

无论何时,只要依赖属性的值改变了,WPF就会自动根据属性的元数据(metadata)触发一系列动作。这些动作可以重新呈现适当的元素、更新当前布局、刷新数据绑定等。内建的变更通知最有趣的特性之一是属性触...
  • sheila_1988
  • sheila_1988
  • 2012年02月20日 13:58
  • 4975

通过c# 实现自定义属性改变触发自定义事件 ,理解自定义事件及其触发过程

以下说明可解释自定义的事件的自定义触发过程: 直接上代码,内含说明(界面是两个文本框textbox1,textbox2,和一个button1,界面的Load事件,button的click事件) ...
  • GoodShot
  • GoodShot
  • 2015年03月05日 10:46
  • 7283

.Net T4 模板 实例(一)

.net T4 模板 实例
  • anjingyatou
  • anjingyatou
  • 2015年02月10日 11:04
  • 1133

WPF自定义控件,将该控件中包含的控件的某个属性绑定到自定义的属性对外暴露

1、问题的描述:我自定义一个MyButton,该Button中包含一个TextBlock和一个Button,我想讲TextBlock的Text属性对外暴露,如:Mybutton.Text实际上就是Te...
  • hxfhq1314
  • hxfhq1314
  • 2016年07月02日 15:52
  • 3130
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WPF 自定义属性和触发器
举报原因:
原因补充:

(最多只允许输入30个字)