zoukankan      html  css  js  c++  java
  • 依赖属性

      圣殿骑士更新了博客.第七章主要是讲的"依赖属性".

    所以自己看书也了解下这个属性!依赖属性对于WPF还是非常重要的,学习这段知识的时候,还是应该慢点,细点!

    public class Button : ButtonBase
            {
                public static readonly DependencyProperty IsDefaultProperty;
    
                static Button()
                {
                    Button.IsDefaultProperty = DependencyProperty.Register("IsDefault", typeof(bool), typeof(Button), new FrameworkPropertyMetadata(false
                        , new PropertyChangedCallback(OnIsDefaultChanged)));
                }
            
            }
            //.NET属性包装器(可选)
            public bool IsDefault
            {
                get { return (bool)GetValue(Button.IsDefaultProperty); }
                set { SetValue(Button.IsFocusedProperty, value); }
            }
    
            //属性改变的回调(可选)
            private static void OnIsDefaultChanged(DependencyObject o,DependencyPropertyChangedEventArgs e)
            { 
            
            }
    

    IsDefaultProperty 静态成员是真正的依赖属性,类型System.Windows.DependencyProperty.按规则,所有的DependencyProperty成员必须都是Public、static,并且有一个property作为后缀,依赖属性通常是用过调用DependencyProperty.Register静态方法创建的.这样的方法需要一个名称(IsDefault)、一个属性类型(bool)以及一个拥有这个属性的类(Button 类).通过不同的Register方法重载.你可以传入metadata(元数据)来告诉WPF如何处理该属性、如何处理属性改变的回调、如何处理强制值转换,以及如何验证值. Button毁在他的静态构造函数中调用Register的重载,给依赖属性一个默认值false,并为变更通知添加一个委托.

    2.自己写了随便写了一个

    <Window x:Class="WpfApplication2.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525"
            FontSize="30" Foreground="Orange" FontStyle="Italic">
    
        <StackPanel>
            
            <Label Background="White" FontSize="20">
                12345566777
            </Label>
            <Label>22222222</Label>
            <Label>33333333</Label>
            <ListBox >
                <ListBoxItem>110</ListBoxItem>
                <ListBoxItem>120</ListBoxItem>
            </ListBox>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Height="Auto" Width="Auto">
                <Button Width="75" Margin="10">OK</Button>
                <Button Width="75" Margin="10">Cancel</Button>
            </StackPanel>
            <StatusBar Height="43">1233131311313</StatusBar>
        </StackPanel>
    
    </Window>
    
    

    对于大部分元素来说,设置回沿着逻辑数向下传递,并由子元素继承.这甚至会影响Button和LIstboxItem元素,尽管他们位于逻辑树的第三层,第一个Label的FontSize并没有改变,因为它被显示的值为20,重载了继承的值30.而继承后的FontStyle的Italic设置将会影响所有的Label、ListboxItem和Button元素,这是因为他们没有被显式设置过.

    注意:虽然StatusBar也像其他空间一样支持着两个属性,但它的文本并没有收到任何值影响.属性值的继承行为时由以下的两种因素决定的:

    ①并不是每个依赖属性都参与属性值继承的.

    ②有其他一些优先级更高的源来设置这些属性值

    有一些控件如StatusBar、Menu和ToopTip控件,其内部会把字体属性设置为当前的系统设置.通过这种方式.用户可以在控制面板中控制他们的字体....这样的控件会吞噬所有的继承.

    3.附加属性

       TextElement.FontSize和TextElement.FontStyle(而不是简单的FontSize和FontStyle属性),必须在StackPanel元素中使用.因为StackPanel没有这两个属性.当XAML解析器或者编译器遇到这种语法的时,他就要求TextElement(有时叫做附加属性提供者)有两个状态分别叫做SetFontSize和SetFontyle,这样他们才可以设置相应的属性值.

    [转.圣殿骑士]4.依赖属性监听

        如果想监听依赖属性的改变,可以用两种方法实现,

    ①用DependercyProertyDescriptor比较简单,在代码里面写起来也比较便捷;

    ②用OverrideMatadata的方式主要在自定义控件以及处理一些类间关系的时候;

    第一种方法:派生自这个类.然后定义它的属性.重写属性的原数据并传递一个PropertyChangedCallBack参数即可;省略

    第二种方法:第二种方法:这个方法更加简单,获取DependencyPropertyDescriptor并调用AddValueChange()为其挂接一个回调函数

    代码
    private void Window1_Loaded(object sender, RoutedEventArgs e)
    {
    //第二种方法,通过OverrideMetadata
    DependencyPropertyDescriptor descriptor = DependencyPropertyDescriptor.FromProperty(TextBox.TextProperty, typeof(TextBox));
    descriptor.AddValueChanged(tbxEditMe, tbxEditMe_TextChanged);
    }

    private void tbxEditMe_TextChanged(object sender, EventArgs e)
    {
    MessageBox.Show(
    "", "Changed");
    }
  • 相关阅读:
    C#UDP编程总结
    C# TcpListener的编程要点
    三维地图添加切片“lods of null”报错
    三维地图添加切片图层坐标系报错
    03 三维地图添加切片图层
    从ArcMap 10.6.1发布服务到Portal,服务器地址错误
    19 React——Ant Design(按需加载样式文件)
    20 React项目生成及部署
    18 React——Ant Design的使用
    17 React——路由的模块化及嵌套
  • 原文地址:https://www.cnblogs.com/0909/p/1812407.html
Copyright © 2011-2022 走看看