• 《深入浅出WPF》读书笔记


    依赖属性:
    1. 节省实例对内存的开销;
    2. 属性值可以通过Binding依赖到其他对象上。
    WPF中,依赖对象的概念被DependencyObject类实现,依赖属性被DependencyProperty类实现。
    BindingOperations.SetBinding(stu,Student.NameProperty,binding);//绑定方式1
    textBox1.SetBinding();//绑定方式2(FrameworkElement类才有的方法)
    -------------------------------------------------------------------------------------------------
    路由事件
    Windows是消息驱动的操作系统,运行在上面的程序也遵循这个机制运行。
    CLR事件模型:本质上是一个使用event修饰的委托实例;事件的拥有者就是事件的发送者(Sender)
    this.myButton.Click = new EventHandler(this.myButton.Click);//CLR事件模型中确定订阅关系的代码。
    WPF路由事件模型:路由事件的事件拥有者和事件响应者之间没有显式的订阅关系,事件的拥有者只负责激发事件,事件有谁响应他并不知道。事件的响应者则安装有事件检测器,针对某类事件进行监听。当然WPF仍然支持传统的直接事件模型。
    调用源自UIElement类的AddHandler()方法,把监听的事件和事件的处理器关联起来:
    this.gridRoot.AddHandler(Button.ClickEvent,new RoutedEventHandler(this.Button.Clicked));
     
    RoutedEventArgs的SourceOriginalSource:
    路由事件是沿着VisualTree传递的(而不是LogicalTree)
    Source属性表示LogicalTree上消息的源头;(LogicalTree的叶子节点是构成用户界面的控件)
    OriginalSource属性表示VisualTree上消息的源头;(VisualTree连控件中细微的结构也算上)
     
    ---------------------------------------------------------------------------------------------------
    WPF命令
    事件和命令的区别在于命令具有约束力,比如“保存”命令,可以控制事件处理程序的处理逻辑。
    WPF命令系统的几个基本要素:
    1. 命令,实现IComamnd接口,或者直接是RoutedCommand类
    2. 命令源,实现IComamndSource接口,Button,MenuItem,ListBoxItem都实现了这个接口
    3. 命令目标,实现IInputCommand接口
    4. 命令关联,负责将一些外围的逻辑与命令关联起来,比如执行命令后还进行哪些后续操作。
    -----------------------------------------------------------------------------------------------------
    WPF资源
    WPF不但支持程序级的传统资源,同时还推出独具特色的对象级资源,每个界面元素都可以携带自己的资源并可以被自己的子级元素共享。比如说模板,程序样式,主题就经常放在对象级资源中。
     
    首先在XAML中添加名称空间引用:xmlns:sys="clr-namespace:System;assembly=mscorlib"
    示例:
    <Window x:Class="" xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <Window.Resources>
    <sys:String x:Key="str">
    华中师范大学
    </sys:String>
    <sys:String x:Key="dbl">
    3.1415926
    </sys:String>
    </Window.Resources>
    <StackPanel>
    <TextBlock Text="{StaticResource ResourceKey=str}">
    </TextBlock>
    </StackPanel>
    </Windows>
     
    • 在C#代码中使用定义在XAML代码里的资源:
    string text = (string)this.FindResource("str");
    //string text =(string)this.Resources["str"];
    this.textbox1.Text = text;
     
    • WPF中可将资源放在独立的资源中,供多个界面重用:
    <Window.Resources>
    <ResourceDictionary Source="ShineRed.xaml">
    </ResourceDictionary>
    </Window.Resources>
     
    静态资源和动态资源:
    StaticResource是指程序载入内存对资源的一次性使用,之后就不再去访问这个资源;
    DynamicResource是指程序使用过程中还会使用的资源。
     
    向WPF程序添加二进制资源(非WPF资源):
    1. 添加Resource.resx文件
    2. 添加xmlns:prop="clr-namespace:wpfapplication.Properties"
    3. <TextBlock Text="{x:Static prop:Resource.UserName}"></TextBlock>
    -----------------------------------------------------------------------------------------------------------------
    WPF模板
    WPF中的模板分为两类:
    1. ControlTemplate(决定控件长什么样)
    2. DataTemplate(决定数据显示成什么样)
     
    注册转换器:
    public class AutoMakerToLogoPathConverter:IValueConverter
    {
    public object Convert()
    {
    return new BitmapImage(new Uri(uripath,UriKind.Relative))
    }
    public object ConvertBack()
    {
    throw new NotImplementedException();
    }
    }
     
    把Convert以资源的形式放在字典里:
    <Window.Resources>
    <local:AutoMakerToLogoPathConverter x:Key="abc" />
    <local:NameToPhotoPathConverter x:Key="n2p" />
    </Window.Resources>
     
    定义数据模板并使用转换器:
    <DataTempalte x:Key="carDetailViewTemplate">
    <Image Source="{Binding Name,Converter={StaticResource n2p}}";
    </DataTempalte>
     
    设置DataTemplate中的DataType属性(把数据模板应用到某个数据类型上):
    <DataTemplate DataType="{x:Type local:Unit}">
     
    依赖属性:一种可以自己没有值,通过使用Binding从数据源获得值的属性。拥有依赖属性的对象叫做依赖对象(Denpendency Object)。依赖属性可以节省实例对内存的开销。
    为依赖属性添加了CLR属性包装后,其就具有了扮演数据源和数据目标的双重角色的能力。另外,尽管依赖属性所对应的依赖对象没有实现INotifyPropertyChanged接口,但是当属性发生改变时与之关联的Binding对象依然可以得到通知,依赖属性天生就是合格的数据源。
    -------------------------------------------------------------------------------------------------------------------
    附加属性:一个属性本来不属于某一个对象,但由于某种需求而后来被附加上。附加属性本质上是依赖属性。附加属性的作用是将属性与数据类型解耦,让数据类型的设计更加灵活。
     
  • 相关阅读:
    Qt 实现遥感图像显示时的连动效果
    Qt 调试时的错误——Debug Assertion Failed!
    从零开始--系统深入学习IOS(使用Swift---带链接)
    在别人客户端上修改,来匹配测试自己的服务端
    趣拍SDK接入问题Android
    持久化数据
    实现编辑和删除
    实现导航
    创建一个Table View
    定义你的数据模型
  • 原文地址:https://www.cnblogs.com/GISQZC/p/8534657.html
Copyright © 2020-2023  润新知