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:属性触发器

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

使用OpacityMask 属性

UIElement 有OpacityMask 属性,它表示当前元素的不透明蒙版。该属性的值是Brush 类型,当给属性赋值后,该属性仅使用Alpha 通道值,其他通道(RGB)通道将会被忽略。 下面...

Silverlight开发历程—(利用Image.OpacityMask做透明遮罩)

文本画刷ImageBrush   用文本画刷,可以填充一些图形,文字的背景,例如下面代码,利用ImageBrush填充字体的背景。...

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

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

wpf日历控件制作过程分析(2)---自定义样式属性

1.自定义样式看后台代码定义 Code         /**////          /// The DependencyProperty for the TitleStyle property....

WPF 样式(定义样式、引用样式、样式作用域、Trigger触发器)

11

基于SteamVR_Unity_Toolkit自定义射线触发器简单结构

环境:HtcVive,Unity,C#,商店的SteamVR_Unity_Toolkit插件目前htc交互比较主流的还是那个实体射线交互,工具包自带的三种:GetComponent().Destina...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WPF 自定义属性和触发器
举报原因:
原因补充:

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