获取或设置元素参与数据绑定时的数据上下文。数据上下文是一种概念,允许元素从父元素继承有关用于绑定的数据源以及绑定的其他特征(如路径)的信息。此依赖属性继承属性值。 如果有子元素没有通过本地值或样式建立的 DataContext 的其他值,则属性系统会将该值设置为已分配此值的最近父元素的 DataContext 值。

在 XAML 中, DataContext 通常设置为 Binding 声明。 可以使用属性元素语法或特性语法。 还可以使用代码设置 DataContext DataContext 是一种可绑定的属性,可用于在一个上下文可能绑定到另一个上下文的情况下实现。 但是,如果绑定到 DataContext ,请注意不要创建循环绑定引用(不将 DataContext 绑定到其自身,因为 DataContext 属性的属性值继承特性)。

    public class PersonNP:INotifyPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;
        private string name;
        public string Name
            get { return name;  }
            set { name = value; Notify(); }
        private void Notify([CallerMemberName]string obj ="")
            if (PropertyChanged != null)
                this.PropertyChanged (this, new PropertyChangedEventArgs(obj));
 

6种方法绑定DataContext

1.方法①,后台实例化

        private PersonNP pNP;
        public MainWindow()
            InitializeComponent();
            pNP = new PersonNP
                Name = "test"
            this.DataContext = pNP;  //DataContext设置

 2.方法②,DataContext设置

系统默认查找父元素控件的DataContext,不直接声明使用父元素的DataContext。亦可以在其它父元素上声明DataContext。

    <Window.DataContext>
        <local:PersonNP Name="test"/>
    </Window.DataContext>
        <StackPanel>
            <TextBox  Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"></TextBox>
            <TextBlock Text="{Binding Path=Name}"></TextBlock>
        </StackPanel>
    </Grid>
<StackPanel> <StackPanel.DataContext> <local:PersonNP Name="test"/> </StackPanel.DataContext> <TextBox Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"></TextBox> <TextBlock Text="{Binding Name}"></TextBlock> </StackPanel> </Grid>

3.方法③,Resources设置

声明为Resources作为DataContext,系统默认查找父元素的DataContext。亦可以在其它父元素上声明DataContext。

    <Window.Resources>
        <local:PersonNP x:Key="p" Name="test"></local:PersonNP>
    </Window.Resources>
        <StackPanel DataContext="{StaticResource p}">
            <TextBox  Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"></TextBox>
            <TextBlock Text="{Binding Path=Name}"></TextBlock>
        </StackPanel>
    </Grid>
<StackPanel> <StackPanel.Resources> <local:PersonNP x:Key="p" Name="test"></local:PersonNP> </StackPanel.Resources> <TextBox Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" DataContext="{StaticResource p}"></TextBox> <TextBlock Text="{Binding Path=Name}" DataContext="{StaticResource p}"></TextBlock> </StackPanel> </Grid>

1.方法④,查找父元素控件的DataContext

指定查找父元素的类型,即是StackPanel设置的DataContext。

    <Window.Resources>
        <local:PersonNP x:Key="p" Name="test"></local:PersonNP>
    </Window.Resources>
        <StackPanel DataContext="{StaticResource p}">
            <TextBox  Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"></TextBox>
            <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type StackPanel}},Path=DataContext.Name}"></TextBlock>
        </StackPanel>
    </Grid>

2.方法⑤,查找自身控件的DataContext

虽然没有显式设置,但是系统默认会查找父元素控件的DataContext。

    <Window.Resources>
        <local:PersonNP x:Key="p" Name="test"></local:PersonNP>
    </Window.Resources>
         <StackPanel DataContext="{StaticResource p}">
            <TextBox  Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"></TextBox>
            <TextBlock Text="{Binding RelativeSource={RelativeSource Self},Path=DataContext.Name}"></TextBlock>
        </StackPanel>
    </Grid>

3.方法⑥,分别设置控件的DataContext

每个控件分别设置DataContext,但都需要指定ResourceKey,确认DataContext对象是相同的。

    <Window.Resources>
        <local:PersonNP x:Key="p" Name="test"></local:PersonNP>
    </Window.Resources>
        <StackPanel>
            <TextBox Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}">
                <TextBox.DataContext>
                    <StaticResource ResourceKey="p"/>
                </TextBox.DataContext>
            </TextBox>
            <TextBlock Text="{Binding Name}">
                <TextBlock.DataContext>
                    <StaticResource ResourceKey="p"/>
                </TextBlock.DataContext>
            </TextBlock>
        </StackPanel>
    </Grid>

如下两种写法是等价的。

 <StackPanel DataContext="{StaticResource p}">
 <StackPanel DataContext="{Binding Source={StaticResource ResourceKey=p}}">

Source:

1.一般指定特定的Resources。

    <Window.Resources>
        <local:PersonNP x:Key="p" Name="test"></local:PersonNP>
    </Window.Resources>

2 后台获取前台设置的Resource

PersonNP p =(PersonNP)this.FindResource("p");
简介: 获取或设置元素参与数据绑定时的数据上下文。数据上下文是一种概念,允许元素从父元素继承有关用于绑定的数据源以及绑定的其他特征(如路径)的信息。此依赖属性继承属性值。如果有子元素没有通过本地值或样式建立的DataContext的其他值,则属性系统会将该值设置为已分配此值的最近父元素的DataContext值。 在 XAML 中,DataContext通常设置为Binding声明。可以使用属性元素语法或特性语法。还可以使用代码设置DataConte...
Data Context 属性是 绑定 的默认源,除非你具体指定了另外一个源,就像上一章里面我们使用了ElementName属性。它由FrameworkElement类定义,大部分UI控件包括 WPF 窗口都继承于此类。简单地说,它允许你指定一个 绑定 的基。 Date Context 并没有默认源(刚开始的时候是NULL),但是它贯穿整个空间层次结构,你可以为窗口设置一个 Data Context ,然后在任意的子控件
1、写viewModel的基类 NotificationObject: 2、数据属性和命令属性,实现 命令属性的基类: 3、3个数据属性和2个命令属性(add和save),实现viewModel 4、在xaml中, 绑定 : 5、添加 Data Context
oneWay:使用 OneWay 绑定 时,每当源发生变化,数据就会从源流向目标。 OneTime: 绑定 也会将数据从源发送到目标;但是,仅当启动了应用程序或 Data Context 发生更改时才会如此操作,因此,它不会侦听源中的更改通知。 OneWayToSource: 绑定 会将数据从目标发送到源。 TwoWay: 绑定 会将源数据发送到目标,但如果目标属性的值发生变化,则会将它们发回给源。 Default: binding 的模式根据实际情况来定,如果是可编辑的就是TwoWay,只读的就是OneWay. 上面的例子不设Mode时,默认的就是Default. 1.使用ObservableCollection 来声明这个数据集合,不能使用ListT<T>或者Dictionary<TKey,TValue>。Observable意味着MVVM中的View可以观察你的集合对象。当我们数据集合变化时,界面会发生相应的变化。 2.实现一个INotifyPropertyChanged的接口,这样我们的属性改变时,才会通知界面。 3.每一个 WPF 中的控件都有一个 Data Context 属性,集合控件会有一个ItemSource的属性,这些属性都可以让我们去 绑定 数据。
1)在FrameworkElement类下有两个重要的属性。利用这两个属性,可以实现UI数据直接与后台的类进行 绑定 2)前端UI界面属性值等动态与后台 绑定 的方式有多种,此处列出后台设置 Data Context 以及前端设置 Data Context 的两种方式,以及数据双向 绑定 的最佳实践纯前端的方式好处在于,编译一下,就可以在设计阶段看到效果。 1)先定义好我们的类 2)在前端按照步骤引入 后台设置 Data Context 在设计阶段是看不到效果的,但是灵活性更高,属性值不用写死 1)定义一个类 2)在当前窗口加载时,进
数据 绑定 中使用 Data Context 数据上下文, Data Context 属性是 绑定 的默认源,除非你特别声明另一个源。 Data Context 属性没有默认源(从一开始就是 null),但是由于 Data Context 是通过控件层次结构向下继承的,因此可以为 Window 本身设置一个 Data Context ,然后在所有子控件中使用它。UI XAML 代码: 后台 绑定 : 这个例子的代码隐藏只添加了一行有趣的代码:在标准的 InitalizeComponent() 调用之后,我们将“this”引用分配给 Da
12.2.1 SolidColorBrush画刷 290 12.2.2 LinearGradientBrush画刷 290 12.2.3 RadialGradientBrush画刷 292 12.2.4 ImageBrush画刷 294 12.2.5 平铺的ImageBrush画刷 295 12.2.6 VisualBrush画刷 297 12.2.7 BitmapCacheBrush画刷 298 12.3 变换 299 12.3.1 变换形状 300 12.3.2 变换元素 302 12.4 透明 303 12.4.1 使元素半透明 303 12.4.2 透明掩码 304 12.5 小结 306 第13章 几何图形和图画 307 13.1 路径和几何图形 307 13.1.1 直线、矩形和椭圆图形 308 13.1.2 使用GeometryGroup 组合形状 309 13.1.3 使用CombinedGeometry融合 几何图形 311 13.1.4 使用PathGeometry绘制曲线和 直线 313 13.1.5 微语言几何图形 318 13.1.6 使用几何图形进行剪裁 319 13.2 图画 320 13.2.1 显示图画 322 13.2.2 导出插图 324 13.3 小结 326 第14章 效果和可视化对象 327 14.1 可视化对象 327 14.1.1 绘制可视化对象 328 14.1.2 在元素中封装可视化对象 329 14.1.3 命中测试 332 14.1.4 复杂的命中测试 334 14.2 效果 338 14.2.1 BlurEffect类 338 14.2.2 DropShadowEffect类 339 14.2.3 ShaderEffect类 340 14.3 WriteableBitmap类 342 14.3.1 生成位图 342 14.3.2 写入WriteableBitmap对象 343 14.3.3 更高效的像素写入 345 14.4 小结 347 第15章 动画基础 349 15.1 理解 WPF 动画 349 15.1.1 基于时间的动画 349 15.1.2 基于属性的动画 350 15.2 基本动画 351 15.2.1 Animation类 351 15.2.2 使用代码创建动画 353 15.2.3 同时发生的动画 358 15.2.4 动画的生命周期 358 15.2.5 Timeline类 359 15.3 故事板 362 15.3.1 故事板 363 15.3.2 事件触发器 363 15.3.3 重叠动画 366 15.3.4 同步的动画 367 15.3.5 控制播放 367 15.3.6 监视动画进度 371 15.4 动画缓动 373 15.4.1 使用缓动函数 373 15.4.2 在动画开始时应用缓动与在动画 结束时应用缓动 374 15.4.3 缓动函数类 375 15.4.4 创建自定义缓动函数 377 15.5 动画性能 379 15.5.1 期望的帧率 380 15.5.2 位图缓存 382 15.6 小结 384 第16章 高级动画 385 16.1 动画类型回顾 385 16.1.1 动态变换 386 16.1.2 动态改变画刷 390 16.1.3 动态改变像素着色器 392 16.2 关键帧动画 393 16.2.1 离散的关键帧动画 395 16.2.2 缓动关键帧 395 16.2.3 样条关键帧动画 396 16.3 基于路径的动画 397 16.4 基于帧的动画 399 16.5 使用代码创建故事板 402 16.5.1 创建主窗口 403 16.5.2 创建Bomb用户控件 405 16.5.3 投弹 406 16.5.4 拦截炸弹 409 16.5.5 统计炸弹和清理工作 410 16.6 小结 412 第Ⅳ部分 模板和自定义元素 第17章 控件模板 417 17.1 理解逻辑树和可视化树 417 17.2 理解模板 422 17.2.1 修饰类 424 17.2.2 剖析控件 426 17.3 创建控件模板 428 17.3.1 简单按钮 429 17.3.2 模板 绑定 430 17.3.3 改变属性的触发器 431 17.3.4 使用动画的触发器 434 17.4 组织模板资源 435 17.4.1 分解按钮控件模板 436 17.4.2 通过样式应用模板 438 17.4.3 自动应用模板 439 17.4.4 由用户选择的皮肤 440 17.5 构建更复杂的模板 442 17.5.1 嵌套的模板 443 17.5.2 修改滚动条 445 17.5.3 控件模板示例 450 17.6 可视化状态 451 17.7 小结 452 第18章 自定义元素 453 18.1 理解 WPF 中的自定义元素 454 18.2 构建基本的用户控件 456 18.2.1 定义依赖项属性 456 18.2.2 定义路由事件 459 18.2.3 添加标记 460 18.2.4 使用控件 462 18.2.5 命令支持 462 18.2.6 深入分析用户控件 465 18.3 创建无外观控件 466 18.3.1 修改颜色拾取器的代码 466 18.3.2 修改颜色拾取器的标记 467 18.3.3 精简控件模板 469 18.4 支持可视化状态 472 18.4.1 开始编写FlipPanel类 473 18.4.2 选择部件和状态 475 18.4.3 默认控件模板 476 18.4.4 使用FlipPanel控件 482 18.4.5 使用不同的控件模板 483 18.5 创建自定义面板 485 18.5.1 两步布局过程 485 18.5.2 Canvas面板的副本 488 18.5.3 更好的WrapPanel面板 489 18.6 自定义绘图元素 492 18.6.1 OnRender( )方法 493 18.6.2 评估自定义绘图 494 18.6.3 自定义绘图元素 495 18.6.4 创建自定义装饰元素 497 18.7 小结 498 第Ⅴ部分 数据 第19章 数据 绑定 501 19.1 使用自定义对象 绑定 到 数据库 501 19.1.1 构建数据访问组件 502 19.1.2 构建数据对象 504 19.1.3 显示 绑定 对象 505 19.1.4 更新数据库 508 19.1.5 更改通知 508 19.2 绑定 到对象集合 510 19.2.1 显示和编辑集合项 510 19.2.2 插入和移除集合项 513 19.2.3 绑定 到ADO.NET对象 514 19.2.4 绑定 到LINQ表达式 515 19.3 提高大列表的性能 518 19.3.1 虚拟化 518 19.3.2 项容器再循环 519 19.3.3 缓存长度 519 19.3.4 延迟滚动 520 19.4 验证 521 19.4.1 在数据对象中进行验证 521 19.4.2 自定义验证规则 526 19.4.3 响应验证错误 528 19.4.4 获取错误列表 529 19.4.5 显示不同的错误指示符号 530 19.4.6 验证多个值 533 19.5 数据提供者 535 19.5.1 Object Data Provider 536 19.5.2 Xml Data Provider 539 19.6 小结 541 第20章 格式化 绑定 的数据 543 20.1 数据 绑定 回顾 543 20.2 数据转换 544 20.2.1 使用StringFormat属性 545 20.2.2 值转换器简介 546 20.2.3 使用值转换器设置字符串 的格式 547 20.2.4 使用值转换器创建对象 549 20.2.5 应用条件格式化 551 20.2.6 评估多个属性 552 20.3 列表控件 554 20.4 列表样式 555 20.4.1 ItemContainerStyle 556 20.4.2 包含复选框或单选按钮的ListBox 控件 557 20.4.3 交替条目样式 559 20.4.4 样式选择器 561 20.5 数据模板 564 20.5.1 分离和重用模板 566 20.5.2 使用更高级的模板 567 20.5.3 改变模板 569 20.5.4 模板选择器 570 20.5.5 模板与选择 573 20.5.6 改变项的布局 577 20.6 ComboBox控件 578 20.7 小结 581 第21章 数据视图 583 21.1 View对象 583 21.1.1 检索视图对象 584 21.1.2 视图导航 584 21.1.3 以声明方式创建视图 587 21.2 过滤、排序与分组 588 21.2.1 过滤集合 588 21.2.2 过滤 Data Table对象 591 21.2.3 排序 592 21.2.4 分组 593 21.2.5 实时成型 598 21.3 小结 599 第22章 列表、树和网格 601 22.1 ListView控件 601 22.1.1 使用GirdView创建列 602 22.1.2 创建自定义视图 606 22.2 TreeView控件 613 22.2.1 创建数据 绑定 的TreeView 控件 614 22.2.2 将 Data Set对象 绑定 到TreeView 控件 617 22.2.3 即时创建节点 618 22.3 Data Grid控件 621 22.3.1 改变列的尺寸与重新安排列 622 22.3.2 定义列 623 22.3.3 设置列的格式和样式 628 22.3.4 设置行的格式 629 22.3.5 显示行细节 630 22.3.6 冻结列 631 22.3.7 选择 632 22.3.8 排序 632 22.3.9 编辑 633 22.4 小结 635 第Ⅵ 窗口、页面和富控件 第23章 窗口 639 23.1 Window类 639 23.1.1 显示窗口 641 23.1.2 定位窗口 642 23.1.3 保存和还原窗口位置 642 23.2 窗口交互 644 23.2.1 窗口所有权 646 23.2.2 对话框模型 647 23.2.3 通用对话框 648 23.3 非矩形窗口 649 23.3.1 简单形状窗口 649 23.3.2 具有形状内容的透明窗口 651 23.3.3 移动形状窗口 653 23.3.4 改变形状窗口的尺寸 653 23.3.5 组合到一起:窗口的自定义控件 模板 655 23.4 Windows 7任务栏编程 658 23.4.1 使用跳转列表 659 23.4.2 改变任务栏图标和预览 663 23.5 小结 667 第24章 页面和导航 669 24.1 基于页面的导航 669 24.2 基于页面的界面 670 24.2.1 创建一个具有导航窗口的基于 页面的简单应用程序 670 24.2.2 Page类 672 24.2.3 超链接 673 24.2.4 在框架中驻留页面 675 24.2.5 在另一个页面中驻留页面 677 24.2.6 在Web浏览器中驻留页面 678 24.3 页面历史 678 24.3.1 深入分析 WPF 中的URI 678 24.3.2 导航历史 679 24.3.3 维护自定义的属性 681 24.4 导航服务 682 24.4.1 通过编程进行导航 682 24.4.2 导航事件 683 24.4.3 管理日志 684 24.4.4 向日志添加自定义项 685 24.4.5 使用页函数 689 24.5 XAML浏览器应用程序 692 24.5.1 创建XBAP应用程序 692 24.5.2 部署XBAP应用程序 693 24.5.3 更新XBAP应用程序 695 24.5.4 XBAP应用程序的安全性 695 24.5.5 完全信任的XBAP应用程序 696 24.5.6 组合XBAP/独立应用程序 697 24.5.7 为不同的安全级别编写代码 697 24.5.8 在网页中嵌入XBAP 应用程序 702 24.6 WebBrowser控件 702 24.6.1 导航到页面 703 24.6.2 构建DOM树 704 24.6.3 使用.NET代码为网页添加 脚本 706 24.7 小结 708 第25章 菜单、工具栏和功能区 709 25.1 菜单 709 25.1.1 Menu类 710 25.1.2 菜单项 710 25.1.3 Context Menu类 712 25.1.4 菜单分隔条 713 25.2 工具栏和状态栏 714 25.2.1 ToolBar控件 714 25.2.2 StatusBar控件 717 25.3 功能区 718 25.3.1 添加功能区 719 25.3.2 应用程序菜单 720 25.3.3 选项卡、组与按钮 722 25.3.4 富工具提示 724 25.3.5 带有快捷键提示的键盘访问 725 25.3.6 改变功能区的大小 726 25.3.7 快速访问工具栏 729 25.4 小结 730 第26章 声音和视频 731 26.1 播放WAV音频 731 26.1.1 SoundPlayer类 731 26.1.2 SoundPlayerAction类 733 26.1.3 系统声音 733 26.2 MediaPlayer类 734 26.3 MediaElement类 735 26.3.1 使用代码播放音频 736 26.3.2 处理错误 737 26.3.3 使用触发器播放音频 737 26.3.4 播放多个声音 739 26.3.5 改变音量、平衡、速度以及 位置 740 26.3.6 将动画同步到音频 742 26.3.7 播放视频 744 26.3.8 视频效果 744 26.4 语音 747 26.4.1 语音合成 747 26.4.2 语音识别 749 26.5 小结 751 第27章 3D绘图 753 27.1 3D绘图基础 753 27.1.1 视口 754 27.1.2 3D对象 754 27.1.3 摄像机 761 27.2 深入研究3D绘图 765 27.2.1 着色和法线 766 27.2.2 更复杂的形状 769 27.2.3 Model3DGroup集合 769 27.2.4 使用材质 771 27.2.5 纹理映射 773 27.3 交互和动画 777 27.3.1 变换 777 27.3.2 旋转 778 27.3.3 飞过 779 27.3.4 跟踪球 781 27.3.5 命中测试 782 27.3.6 3D表面上的2D元素 786 27.4 小结 789 第Ⅶ部分 文档和打印 第28章 文档 793 28.1 理解文档 793 28.2 流文档 794 28.2.1 流内容元素 795 28.2.2 设置内容元素的格式 796 28.2.3 创建简单的流文档 797 28.2.4 块元素 799 28.2.5 内联元素 804 28.2.6 通过代码与元素进行交互 809 28.2.7 文本对齐 812 28.3 只读流文档容器 813 28.3.1 缩放 814 28.3.2 创建页面和列 815 28.3.3 从文件加载文档 817 28.3.4 打印 818 28.4 编辑流文档 818 28.4.1 加载文件 819 28.4.2 保存文件 821 28.4.3 设置所选文本的格式 822 28.4.4 获取单个单词 824 28.5 固定文档 825 28.6 批注 826 28.6.1 批注类 827 28.6.2 启用批注服务 828 28.6.3 创建批注 829 28.6.4 检查批注 832 28.6.5 响应批注更改 835 28.6.6 在固定文档中保存批注 835 28.6.7 自定义便签的外观 836 28.7 小结 837 第29章 打印 839 29.1 基本打印 839 29.1.1 打印元素 840 29.1.2 变换打印输出 842 29.1.3 打印不显示的元素 844 29.1.4 打印文档 845 29.1.5 在文档打印输出中控制页面 848 29.2 自定义打印 851 29.2.1 使用可视化层中的类 进行打印 851 29.2.2 自定义多页打印 854 29.3 打印设置和管理 859 29.3.1 保存打印设置 859 29.3.2 打印页面范围 859 29.3.3 管理打印队列 860 29.4 通过XPS进行打印 863 29.4.1 为打印预览创建XPS文档 863 29.4.2 写入内存的XPS文档 864 29.4.3 通过XPS直接打印到 打印机 865 29.4.4 异步打印 866 29.5 小结 866 第Ⅷ部分 其他主题 第30章 与Windows窗体进行交互 869 30.1 访问互操作性 869 30.2 混合窗口和窗体 870 30.2.1 为 WPF 应用程序添加窗体 870 30.2.2 为Windows窗体应用程序 添加 WPF 窗口 870 30.2.3 显示模态窗口和窗体 871 30.2.4 显示非模态窗口和窗体 871 30.2.5 启用Windows窗体控件的 可视化风格 872 30.3 创建具有混合内容的窗口 872 30.3.1 WPF 和Windows窗体 “空域” 873 30.3.2 在 WPF 中驻留Windows 窗体控件 874 30.3.3 使用 WPF 和Windows窗体 用户控件 876 30.3.4 在Windows窗体中驻留 WPF 控件 877 30.3.5 访问键、助记码和焦点 879 30.3.6 属性映射 880 30.4 小结 882 第31章 多线程 883 31.1 了解多线程模型 883 31.1.1 Dispatcher类 884 31.1.2 DispatcherObject类 884 31.2 BackgroundWorker类 887 31.2.1 简单的异步操作 887 31.2.2 创建BackgroundWorker 对象 888 31.2.3 运行BackgroundWorker 对象 889 31.2.4 跟踪进度 891 31.2.5 支持取消 893 31.3 小结 894 第32章 插件模型 895 32.1 在MAF和MEF两者间 进行选择 895 32.2 了解插件管道 896 32.2.1 管道的工作原理 897 32.2.2 插件文件夹结构 898 32.2.3 为使用插件模型准备 解决方案 899 32.3 创建使用插件模型的 应用程序 900 32.3.1 协定 901 32.3.2 插件视图 901 32.3.3 插件 902 32.3.4 插件适配器 902 32.3.5 宿主视图 903 32.3.6 宿主适配器 904 32.3.7 宿主 904 32.3.8 更多插件 907 32.4 与宿主进行交互 908 32.5 可视化插件 912 32.6 小结 915 第33章 ClickOnce部署 917 33.1 理解应用程序部署 917 33.1.1 ClickOnce安装模型 918 33.1.2 ClickOnce部署的局限性 919 33.2 简单的ClickOnce发布 920 33.2.1 设置发布者和产品 920 33.2.2 启动发布向导 922 33.2.3 理解部署文件的结构 926 33.2.4 安装ClickOnce应用程序 926 33.2.5 更新ClickOnce应用程序 928 33.3 ClickOnce附加选项 928 33.3.1 发布版本 928 33.3.2 更新 929 33.3.3 文件关联 930 33.3.4 发布选项 931 33.4 小结 932 在 WPF 中,应用程序有两层:UI层和 Data 层。这里新建一个项目说明哪些是UI层,哪些是数据层。 UI层很明显,就是用户看到的界面。但是数据层并不是下图所示: 上图中是UI层view的后台代码。当然,你可以使用事件的方式把所有的业务逻辑代码写到这里,但是我们采用MVVM的时候业务逻辑是与这里解耦的,数据层是 Data Context ,此时并没有指定。 接下来我们新建个目录,然后添加个类文件: 然后指定VM类为 Data Context : 此时我们才算为MVVM模式的wp UI元素树的每一个结点都有 Data Context ,当 Binding 只知道自己的path ,而不知道source时,会沿着 UI元素树一路的向树根部找过去,路过节点,比较结点的 Data Context 是否具有Path所指定的属性,有的话,把对应的节点对象作为自己的source C# class
WPF 是一种基于Windows Presentation Foundation技术的用户界面设计与开发工具,对于SimpleCAD这样一款CAD软件来说,拥有 WPF 技术支持可以提供更加丰富的交互能力和可定制性。SimpleCAD采用 WPF 技术开发具有更高的灵活性、更好的界面布局效果和更快的绘图效率,同时支持投影、图像缩放、组合操作等高级功能。在使用上,SimpleCAD能够为用户提供更加直观的操作界面,使得使用者可以更加轻松地完成复杂的绘图任务。采用 WPF 技术还使得SimpleCAD可以支持更多的文件格式,包括PDF、DWG等,这大大提高了SimpleCAD的应用范围和数据交换效率。总之,采用 WPF 技术的SimpleCAD显然比传统CAD软件更加先进和实用,具有更高的开发价值和市场竞争力。