精华内容
下载资源
问答
  • WPF 高级编程 PDF文件

    2018-06-20 18:34:00
    WPF高级编程设计电子书,内容不错!!!!!!!!!!!!
  • WPF高级编程

    2018-12-19 11:58:36
    WPF高级编程中文版,PDF扫描文件。 作者:(美国)(Andrade.C.)安德拉德 等 译者:王德才 吴明飞 ,《WPF高级编程》通过使用Visual Studio创建几个示例程序,带领您快速进入应用程序开发。此外,还将介绍XAML—— 创建...
  • WPF 高级.pdf

    2021-02-03 16:09:05
    WPF 高级编程教程 PDF 版
  • 上传了比较权威的两本书,《WPF自学手册》与《WPF高级编程》从入门到精通自学WPF的最佳手册 ,希望我上传的资料能帮助正在学习WPF的人。
  • WPF高级样式与模板

    2021-08-29 18:52:17
    一:这里讲一下在日常编程写代码中,有时候会去用WPF中原生的控件就可以去实现所需要的需求,但是样式和风格并不能满足我们的需求,这里呢就有一个办法就是我们自己在WPF中去定义自己喜欢的样式,不同的风格和样式化...

    一:这里讲一下在日常编程写代码中,有时候会去用WPF中原生的控件就可以去实现所需要的需求,但是样式和风格并不能满足我们的需求,这里呢就有一个办法就是我们自己在WPF中去定义自己喜欢的样式,不同的风格和样式化。定义模板和样式。

    二:在WPF中我们可以使用Style来设置控件的某些属性值,并使该设置影响到指定范围内的所有类控件或影响指定 的某一控件,比如说我们想将窗口中的所有按钮都保持一种风格,那么我们可以设置一个Style,而不必分别每个按钮的风格,Style是作为一种资源被保存下来的。举个例子:
    注意:Style样式中的Key这里是暂时还没有指定对应的控件,所以才会出现报错情况,
    在这里插入图片描述

    在这里可以去添加另一种就是动态化样式效果。,可添加Trigger:触发器

    在这里插入图片描述

    二、模板
    ControlTemplate 指定控件的可视结构和可视行为。可以通过为控件指定
    新 ControlTemplate 自定义该控件的外观。创建 ControlTemplate 后,可以在不更改现
    有控件的功能的情况下更改其外观。例如,您可以将应用程序中的按钮设置为圆形,而
    不是默认的方形,但该按钮仍将引发 Click 事件。 注意: 在重定义模板前,你应该充分了
    解该空间的模板类型

    定义模板的方法有三种:
    1.内联定义:
    在这里插入图片描述

    2.定义为资源样式:
    在这里插入图片描述

    3.通过Style定义:
    在这里插入图片描述

    展开全文
  • WPF全套高级视频教程

    2020-04-01 13:46:31
    WPF高级视屏教程(7个G) 适合于基础较好的同学
  • WPF高级教程(一)概述

    千次阅读 2020-02-19 22:40:37
    WPF是什么 WPF是基于Windows的用户界面框架,划重点:基于Windows,用户界面框架。 需要注意的是,WPF仅仅是有关于用户界面渲染的技术,而后台的开发,与系统的交互等都需要.NET Framework 的支持。 为什么写这一...

    WPF是什么

    WPF是基于Windows的用户界面框架,划重点:基于Windows,用户界面框架。

    需要注意的是,WPF仅仅是有关于用户界面渲染的技术,而后台的开发,与系统的交互等都需要.NET Framework 的支持。

    为什么写这一系列教程

    在写这一系列教程之前,我去逛了逛论坛,对WPF一如既往的唱衰之声,而其核心问题,就是它不能跨平台,那么WPF究竟还有没有其存在的价值呢?

    我在很多城市有过一些考察,发现WPF是一项很神奇的技术,一方面很多公司的桌面软件还保持着90年代Windows窗体质朴的本色,他们说WPF没有用,我这个WinForm写的软件用的就很好,而且我以后的发展是在线上。另一方面,稍微有实力的公司,无法忍受WinForm质朴的界面选择了WPF,却因为自己的客户中很多Mac用户吐槽其没有Mac版,而认为WPF不能跨平台的特性是硬伤,最终选择使用QT,C++重写软件(毕竟这些公司也不差钱),笔者也因为类似的原因对于分享一些WPF相关的技术一拖再拖。

    刺激到我的是在研究跨平台桌面软件开发的过程中使用Electron而学习了vue,学的过程中,我的反应是:这不是WPF中的绑定么,这里能不能写转换器呢?我才发现,WPF中MVVM深入骨髓,而前端,也经历了由事件驱动到数据驱动的变革,甚至这门08年发布的框架中的很多很好用的特性在前端框架中至今没有得到实现(相信以后会越来越好)。本着学习的角度,了解这门技术本身就是很有意义的。

    所以我决定将这一系列的教程写出来,让有需要的人能够了解这门技术,让真正需要使用它的朋友能够能够提高,相信这一部分人看了这一系列教程一定能发现一些之前没有用过的好特性。

    评价

    WPF是Windows95以来对Windows界面影响最深刻的技术。

    旧技术

    • User32 绘制窗口,按钮,文本框控件等
    • GDI/GDI+ 图像渲染,绘图支持

    新的图像引擎

    DirectX,这个引擎起初是为了游戏开发设计,拥有强大的性能和复杂的API,WPF开发的Windows程序底层使用了DX进行渲染,极大程度的利用了显卡的性能。

    硬件加速

    WPF为了适配不同的机器,提供了三个不同的渲染级别

    • Rendering Tier0 显卡不提供硬件加速
    • Rendering Tier1 显卡提供部分硬件加速
    • Rendering Tier2 所有性能硬件加速
    // 获取渲染级别
    int renderingTier = (RenderCapability.Tier >> 16);
    MessageBox.Show("渲染级别为:" + renderingTier.ToString());
    

    分辨率无关

    WPF根据系统的DPI进行缩放,可以解决传统的GDI绘图在分辨率较高的屏幕上画面紧缩的问题。设置系统的DPI,WPF绘制的图形会自动进行缩放。这里我们扩展一点知识:分辨率指的是显示屏在长宽上面拥有的像素个数,DPI指的是每英寸的点数,那我们可以发现,分辨率加大的时候,DPI加大。我们经常看到的在分辨率减少的情况下,窗口变大就是分辨率有关的事实。WPF要做到在分辨率变高的时候,窗口的大小不变,这就需要WPF根据系统的DPI动态的绘制窗口的大小。算法是这样的

    [物理尺寸] = [设备无关的尺寸] * [系统DPI]
    

    设备无关的尺寸是WPF内部定义的,这样就保证了在不同分辨率下的缩放。

    设备无关的尺寸定义为1/96英寸,从上面的公式可以看到,当DPI=96的时候,WPF的一个单位就是一英寸。

    细说分辨率无关

    很多人都听过WPF分辨率无关的特性,但是细问之下却不能说出这个分辨率无关到底指的是什么,上面我们举了例子,但是可能还有一些同学并不知道这其中的意思,那么下面我们用最通俗易懂的几个问题解释下WPF做了什么。

    1. 当我们在WPF中写一个按钮的长度为100px的时候,这个px(像素)指的是多大呢?也就是说 WPF 中的1px是多大呢?

      回答是,不一定!这个不一定就是微软宣传的分辨率无关。WPF中的px不是我们在学习LED屏的时候说的一个小灯就是一个像素点,也不是我们画点阵的时候说的一个点就是一个像素点,也不是我们喷墨打印机喷墨的时候一个墨点就是一个像素点,WPF中的一个像素,被固定为了 1/96 英寸。也就是说,当你在WPF中写一个按钮的宽度是96px,就是等于告诉WPF,我想要一个一英寸宽的按钮。

    2. 当我们在WPF中写 我想要96px宽度的按钮,在不同的显示器,不同的分辨率真的都能给我绘制出一英寸的按钮么?

      答案是:不一定!这个不一定,就是很多同学困惑的,那么微软是不是忽悠我们呢,这里渲染成多少到底跟多少因素有关系呢?我们首先解谜:跟你的显示器自身物理DPI有关系,也跟系统DPI设置有关系。

      物理DPI,就是显示器自身到底多少个点是一英寸,系统DPI就是系统认为多少个点是一英寸,我们很容易发现,如果物理DPI和系统DPI对不上,即使WPF知道我想要一英寸的按钮,它使用系统DPI一算,算应该是多少点,结果到了显示器渲染的时候,用这么多点渲染出来的也不是一英寸,这里就有一个信息的差异,WPF只能帮我们告诉系统我们真实想要多少长度,而真正显示长度的是显示器,必须消除显示器和系统之间的DPI差异,才能真正的做到分辨率无关。

    通过上面两个问题我们总结出来:WPF实现分辨率无关的必要条件是:系统DPI与显示器物理DPI值相同

    那么我们最后问一个很多人问过的问题,来看看我们是不是弄懂了:同一个显示器,不改变DPI设置,将屏幕分辨率从1024 * 768调整到800 * 600,使用WPF编写的程序的窗口大小不会变化。(X)完全错误,WPF能消除这样设置的差异吗?显然不能,窗口一定会变大,如果这个结果对你来说并不显然,那你可能需要重新回去看一下上面的一节了。

    展开全文
  • [Apress] WPF 高级程序设计 (C# 2010 及 .NET 4 实现) (英文版) [Apress] Pro WPF in C# 2010 Windows Presentation Foundation in .NET 4 (E-Book) ☆ 图书概要:☆ Microsoft's Windows Presentation ...
  • [Wrox] WPF 高级编程 (英文版) [Wrox] Professional WPF Programming .NET Development with the Windows Presentation Foundation (E-Book) ☆ 出版信息:☆ [作者信息] Chris Andrad, Shawn Livermore, Mike ...
  • WPF高级教程(九)控件

    千次阅读 2020-02-26 15:14:41
    WPF对于小尺寸文字(小于15)的显示,会出现文本模糊的问题,为了解决这个问题,我们需要使用 TextOptions.TextFormattingMode=“Display”,而超过15个设备无关像素的字不使用这个属性效果更好 光标 // 设置为...

    定义

    能够与用户交互的元素。继承自System.Windows.Control,基类提供以下能力:

    • 设置对齐方式
    • 设置Tab顺序
    • 背景,前景,边框
    • 文本内容尺寸和字体

    注意在有时候,我们会在描述的时候说:这是界面上的一个控件,这是界面上的一个元素,那么,控件和元素有什么关系和区别呢?实际上,界面上的可视化的内容就是元素,而能够接受焦点并且能与用户交互的元素叫做控件,所以元素的概念包含控件。这点大家了解即可。

    控件的分类

    • 内容控件,能够嵌套元素,无限扩展显示。比如Button,Label等,大部分控件都是内容控件
    • 带标题的内容控件,包括TabItem,GroupBox
    • 文本控件,允许输入文本,密码或者富文本的控件,比如TextBox
    • 列表控件,ListBox
    • 基于范围的控件,ProgressBar
    • 日期控件,Calendar,DatePicker

    内容控件

    包含单个嵌套元素的控件,这也是跟布局容器不同的地方。下面是内容控件的层级结构
    在这里插入图片描述

    • 布局容器在Panel基类上提供了Children集合保存所有的子控件,而内容控件在基类上提供了Content控件来接收单个元素
    • Content属性的显示:如果其属性值继承自UIElement,则绘制出来,如果不是继承自UIElement,则直接调用ToString方法显示。这就是界面上出错的时候显示一串类型名的原因
    • Window元素不允许被放到内容控件中
    • HasContent判断控件中是否有内容
    • ContentTemplete用于告诉控件如何显示他不识别的对象,数据模板在之后学习
      // 直接给内容控件的Content赋值
      <BUtton>
          <Image/>
      </Button>
      // 嵌套多个元素
      <BUtton>
          <StackPanel>
              <Image/>
              <Image/>
              <Image/>
          </StackPanel>
      </Button>
      
    • 在外层控件给内容的对齐方式需要使用HorizontalContentAlignment属性设置
    • 在外层控件使用Padding属性给内容添加内边距
    • 按钮内置的细节如阴影背景,圆角边框这些不能通过在按钮中改变内容来改变,需要使用控件模板来改变这些设定。
    • 自此,我们提到了两个模板,数据模板ContentTemplate和控件模板,数据模板用于告诉控件如何显示他不识别的对象,控件模板用于改变控件原有的行为。

    带标题的内容控件

    带标题的内容控件是在内容控件的基础上,原有的Content不变,新增了一个Header属性,具体的例子在下面实例中介绍。

    文本控件

    • TextBox 继承自TextBoxBase,只存储字符串
    • RichTextBox 继承自TextBoxBase,存储复杂元素FlowDocument
    • PasswordBox 继承自Control,内部使用SecureString

    列表控件

    • 列表控件继承自ItemsControl
    • 使用列表控件最好配合数据绑定使用

    基于范围的控件

    • 基于范围的控件包括 ScrollBar ProcessBar Slider
    • 基于范围的控件继承自 RangeBase
    • RangeBase提供以下属性
      在这里插入图片描述
    • 通常不使用ScrollBar,而是使用其包装版本ScrollViewer

    日期控件

    • 日期控件有两个 Calendar日历 DatePicker 时间选择控件,日历控件会显示一个日历,时间选择控件只会弹出一个选择框,在点击选择按钮的时候才会弹出可以选择的日历

    • 日期控件的属性很类似,如下图

      在这里插入图片描述
      在这里插入图片描述

    控件属性

    前景色,背景色

    WPF中分别用Background和Foreground来设置背景色和前景色

    • 需要给对象设置Brush对象作为值,Brush支持单一颜色,渐变色等。具体的画刷使用我们在后面专门介绍
    • 代码设置画刷
      lbl_source.Background = new SolidColorBrush(Colors.AliceBlue);
      // 从SystemColors中获取颜色
      lbl_source.Background = new SolidColorBrush(SystemColors.ControlColor);
      // 直接使用画刷
      lbl_source.Background = SystemColors.ControlBrush;
      // 通过RGB设置
      byte red = 0;
      byte green = 255;
      byte blue = 0;
      lbl_source.Background = new SolidColorBrush(Color.FromRgb(red, green, blue));
      // 通过ARGB设置带部分透明的颜色
      // 255 不透明 0 透明
      byte alpha = 100;
      lbl_source.Background = new SolidColorBrush(Color.FromArgb(alpha, red, green, blue));
      // 除了RGN标准,还有一套支持更多颜色的 scRGB 标准,这个标准支持更多的颜色,输入的rgb值也从byte变成了float型
      
    • XAML中设置颜色
      <!--直接设置控件背景色-->
      <Button Background="Red" Content="Button" HorizontalAlignment="Left" Height="24.014" Margin="24.19,276.828,0,0" VerticalAlignment="Top" Width="105.453"/>
      <!--用较长方式设置,与上面的方式等价,但是如果设置的Brush不是SolidColorBrush就必须用下面的格式-->
      <Button  Content="Button" HorizontalAlignment="Left" Height="24.014" Margin="24.19,320.68,0,0" VerticalAlignment="Top" Width="105.453">
          <Button.Background>
              <SolidColorBrush Color="Red"></SolidColorBrush>
          </Button.Background>
      </Button>
      <!--使用RGB值-->
      <Button  Content="Button" Background="#FF0000" HorizontalAlignment="Left" Height="24.014" Margin="24.19,365.576,0,0" VerticalAlignment="Top" Width="105.453" />
      <!--使用ARGB值-->
      <Button Content="Button" Background="#AAFF0000" HorizontalAlignment="Left" Height="24.014" Margin="170.362,365.576,0,0" VerticalAlignment="Top" Width="105.453" /> 
      

    字体

    在这里插入图片描述

    // 设置字体
    <Button FontFamily="Times New Roman"/>
    cmd.FontFamily = "Times New Roman";
    // 直接设置字体的加粗版本
    <Button FontFamily="Times New Roman Bold"/>
    // 设置字体族
    <Button FontFamily="Times New Roman Bold, Arial"/>
    // 获取计算机全部字体
    Fonts.SystemFontFamilies
    
    • 上划线 下划线需要设置TextDecorations:Baseline Overline Strikethrough Underline
    • 字体会继承属性,这样窗口设置的字体全部窗口都会使用
    • 前景色继承,背景色不继承。这里需要注意,背景色设置为空是透明背景,从效果上来看跟继承的效果一样。
    • IsEnabled IsVisible AllowDrop 都是继承属性
    • 依赖项属性是否继承是由 FrameworkPropertyMetadata.Inherits 属性控制
    • 为了防止电脑没有字体文件,需要添加字体文件到应用程序中
      // 添加字体文件到应用程序中
      1. 添加ttf到项目中,设置构建类型为 Resource
      2. 使用该字体
      <Label FontFamily="./#Bayern"/>
      
    • WPF对于小尺寸文字(小于15)的显示,会出现文本模糊的问题,为了解决这个问题,我们需要使用 TextOptions.TextFormattingMode=“Display”,而超过15个设备无关像素的字不使用这个属性效果更好

    光标

    // 设置为小沙漏
    this.Cursor = Cursors.Wait;
    <Button Cursor="Help"/>
    // 自定义光标
    Cursor customCursor = new Cursor(Path.Combine(applicationDir, "stopwatch.ani"));
    this.Cursor = customCursor;
    // 注意Cursor对象不直接使用url资源语法
    // 光标文件加载为资源使用Stream
    StreamResourceInfo sri = Application.GetResourceStream(new Uri("stopwatch.ani", UriKind.Relative));
    Cursor customCursor = new Cursor(sri.Stream);
    
    • 父窗口要强制窗口上的元素全部使用自己的光标类型 ForceCursor = true
    • 应用程序中的全部窗口使用同一个光标类型 Mouse.OverrideCursor = Cursors.Wait,某一个窗口不受这个限制 Mouse.OverrideCursor = null

    控件特点实例

    Label标签

    Label标签支持Target属性

    <Label Target="{Binding ElementName=txt_labelTarget}" Content="_Label" HorizontalAlignment="Left" Margin="685.673,32.846,0,0" VerticalAlignment="Top"/>
    <TextBox x:Name="txt_labelTarget" HorizontalAlignment="Left" Height="21.24" Margin="752.522,32.846,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="154.891"/>
    

    注意:

    • _Label表示L为快捷键,用Alt+L即可选中名字叫txt_labelTarget的输入框,如果想要真正输入下划线,需要双下划线。
    • TextBlock不支持此功能

    Button

    • Button 继承自ButtonBase
    • GridViewColumnHeader RepeatButton ToggleButton 都继承自ButtonBase,GridViewColumnHeader是ListView上面可以单击的标题,RepeatButton在按下的时候会一直触发Click,用于滚动条上下微调按钮,ToggleButton可以设置按下和释放状态,用于开关按钮,工具栏等
    • CheckBox RadioButton 继承自 ToggleButton
    • ButtonBase定义了Click事件
    • ButtonBase定义了ClickMode,默认为ClickMode.Release,还可以设置Press,按下触发,Hover,悬停一会就触发
    • 支持使用下划线设置快捷键
    • Button控件可以设置IsDefault作为默认按键,IsCancel设置取消按钮,按下Esc会触发取消按钮
    • Button拥有一个只读的属性IsDefaulted,他要为true需要两个条件,一是自身没有焦点,一是当前有焦点的控件不接受Enter键输入。这个时候按下回车键会触发这个按钮,这个属性可以用于触发器。
    • CheckBox有三种状态,可以通过IsThreeState设置三种还是两种状态。
      <CheckBox IsChecked="{x:Null}"/>
      
    • RadioButton可以设置GroupName设置分组,如果不设置的时候,同一个容器中的单选按钮默认一组,设置组名可以覆盖该设置。

    ToolTip

    • ToolTip是在FrameworkElement中定义的,所以只要是能放置到窗口上面的元素都可以拥有ToolTip
    • ToolTip样式可以自定义
      <Button>
          <Button.ToolTip>
              <StackPanel>
              ...
              </StackPanel>
          </Button.ToolTip>
      </Button>
      
    • ToolTip不能接受焦点,所以不能在ToolTip中添加可以用户交互的控件,如果想实现这个功能,需要使用Popup控件
    • 属性值
      在这里插入图片描述
    • ToolTip的弹出位置可以灵活的控制,通过上图的属性可以设置如下效果
    • 关于ToolTip的一些属性需要使用ToolTipService来设置,这样设置的好处是,多个控件可以复用同一个ToolTipService,但是要注意的是,这个属性不能被继承,所以不能在父元素中设置一次ToolTipService以期能够在所有的子元素中实现相同的ToolTip效果
      在这里插入图片描述

    Popup

    • Popup和ToolTip都能超出窗口边界
    • Popup的子元素存储在Child中而不是Content中
    • Popup可以接收焦点
    • Popup不会自动显示,需要设置IsOpen
    • Popup默认不会自动消失,如果要实现在其他地方点击鼠标让其消失的效果,需要设置Popup.StaysOpen为false
    • Popup通过PopupAnimation控制进入效果,如果要使用动画效果,需要设置AllowsTransparency为true
    • Popup需要设置Background来让其可见
    <TextBlock HorizontalAlignment="Left" Margin="685.673,85.399,0,0" TextWrapping="Wrap" VerticalAlignment="Top">
        Popup <Run TextDecorations="Underline" MouseEnter="Run_MouseEnter">term</Run>
    </TextBlock>
    <Popup Name="popLink" StaysOpen="False" Placement="Mouse" MaxWidth="200"
           PopupAnimation="Slide" AllowsTransparency="True">
        <Border BorderBrush="Beige" BorderThickness="2" Background="White">
            <TextBlock Margin="10" TextWrapping="Wrap">
                For more information, see
                <Hyperlink NavigateUri="http://www.baidu.com">Baidu</Hyperlink>
            </TextBlock>
        </Border>
    </Popup>
    

    ScrollViewer

    • 默认滚动条都是显示的,如果想让滚动条按需自动显示隐藏,需要设置VerticalScrollBarVisibility为Auto
    • 不显示滚动条可以将VerticalScrollBarVisibility设置为Disable或者Hidden,Hidden的滚动条不显示,但是仍然能通过滚轮或者上下键进行滚动,这个技巧在自定义滚动按钮的时候可以用到
    • 水平滚动条的默认值为隐藏
    • 我们可以通过编程控制滚动条向上向下微调 LineUp() LineDown(),或者向上向下翻页PageUp() PageDown(),或者直接滑动到顶部和底部 ScrollToEnd ScrollToHome
    • 我们可以告诉滚动条其子元素知道如何滚动,其子元素需要继承自IScrollInfo,需要将滚动条的CanContentScroll设置为true,这样滚动条的滚动方法就会引发子元素的滚动方法,进行子元素滚动。StackPanel实现了IScrollInfo接口,所以将StackPanel放在滚动条控件里可以实现逐元素的滚动而不是逐像素的滚动。注意在实验的时候一定要将滚动条控件的 CanContentScroll设置为True,才能成功。这个技术在自定义面板的滚动中很有用。

    GroupBox

    最简单的带标题的内容控件,仅仅是拥有圆角的边框和标题,注意,GroupBox也是内容控件,在其中放置多个元素还是需要使用布局容器。

    在这里插入图片描述

    TabControl

    <TabControl>
        <TabItem>
            <TabItem.Header>
                <Button>123</Button>
            </TabItem.Header>
            <Grid Background="#FFE5E5E5"/>
        </TabItem>
        <TabItem Header="Tab 2">
            <Grid Background="#FFE5E5E5"/>
        </TabItem>
    </TabControl>
    
    • Header属性可以单独设置(带标题的内容控件的特点)
    • 如果要使用代码控制Tab显示,需要设置TabItem的IsSelected属性
    • Header也可以接受所有类型的元素,显示方式和Content是一致的

    Expander 扩展器

    在这里插入图片描述

    • 设置IsExpanderd来改变扩展和收起状态
    • 扩展方向可以设置,设置ExpandDirection属性
    • 显示和隐藏前触发Expanded和Collapsed事件,这个事件的处理常用于延迟加载
    • 可以使用ScrollViewer来设置一个可以滚动的扩展区域
    // 注意ScrollViewer要指定高度
    <Expander Header="Two">
        <ScrollViewer Height="50">
        ...
        </ScrollViewer> 
    </Expander>
    

    TextBox

    • 默认单行文本,如果需要换行需要设置TextWrapping属性为Wrap或WrapWithOverflow
    • 设置最大最小行数,设置这个属性可以实现一个随着文字量的多少自动扩展的文本框 MaxLines MinLines
    • LineCount可以获取文本中有多少行
    • 按下Enter的时候回车需要设置AcceptReturn
    • 按下Tab插入制表符需要设置AcceptTabs
    • 如果要阻止用户修改,可以设置只读IsReadOnly也可以直接禁用
    • 拖拽选中文字,需要关注 SelectionStart选择开始位置 SelectionLength选择长度 SelectedText选择的文本 SelectionChanged事件
    • 拖动逐单词选择 AutoWordSelection
    • 控制是否支持撤销 CanUndo
    • 在使用代码控制文字的时候,将一系列操作使用BeginChange和EndChange包起来,就可以把这一系列操作当作一个操作进行撤销
    • 拼写检查 SpellCheck.IsEnabled,默认 英语 德语 西班牙语。也可以设置自己的资源词典,以期让检查跳过一些人名,或者专业术语。具体的使用规则如果用到可以再研究。

    PasswordBox

    • PasswordBox不支持剪贴板
    • 内部使用SecureString存储,存储的密文是加密的,密钥是随即成成的
    • SecureString拥有Dispose方法,在调用了该方法之后,在内存中彻底清除密文,保证安全

    ListBox

    • 需要多选,可以设置SelectionMode为Multiple或者Extended
    • 虽然ListBox有一个ListBoxItem子元素,但是他足够灵活,不一定非要放置ListBoxItem元素,只要元素继承自UIElement就可以被显示出来,但是内部,仍然是包裹了一层Item

    ComboBox

    • ComboBox可以设置IsEditable属性,让他可以输入
    • 输入的时候,控件会根据列表中对象的ToString方法运行的结果进行匹配,而选中的显示也是ToString运行的结果,这就导致了下拉中可以显示图片,但是选择之后的显示只能显示纯文本的问题
    • 关于这个问题的解决需要使用下面的样式复写原有的Combo样式
      <ContentPresenter Content="{TemplateBinding SelectedItem}" ContentStringFormat="{TemplateBinding DisplayMemberPath}" 
                    HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" IsHitTestVisible="false" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Center"
                        ContentTemplate="{TemplateBinding ItemTemplate}"
                    />
      
      其中需要注意的是,我们需要使用SelectedItem去替换原有的SelectionBoxItem,需要使用ItemTemplate去替换SelectionItemBoxTemplate即可,解决办法来自于ComboBox ItemTemplate only working in dropdown,我们在之后的模板和样式的讲解中将继续研究这里修改的本质原因。

    Slider

    • 常用于音量调节按钮等

    • 属性如下图


    ProcessBar

    • 如果并不清楚一个过程多久才能完成,可以设置IsIndeterminate为true,这时候显示一个从左到右的循环脉冲
    展开全文
  • WPF高级教程(三)XAML

    千次阅读 2020-02-26 08:38:54
    WPF是前后端分离的,前端用XAML实现,后端用C#写(注意能用XAML写的都能用C#实现,但是用XAML更加直观,我们在本篇教程里,一般只说明使用XAML的实现,如果大家需要在后台更改界面,可以自行搜索XAML对应的C#实现) ...

    语言简介

    • XAML(Extensible Application Markup Language) 是用来写界面的
    • XAML是大小写敏感的
    • WPF是前后端分离的,前端用XAML实现,后端用C#写(注意能用XAML写的都能用C#实现,但是用XAML更加直观,我们在本篇教程里,一般只说明使用XAML的实现,如果大家需要在后台更改界面,可以自行搜索XAML对应的C#实现)

    命名空间

    格式

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    
    • http:// 并不是一个网址,而是十几个命名空间的集合,这样做,既保证了这个Uri不会于用户自定义的命名空间重复(因为schemas.microsoft.com是微软所有的)也降低了文档的复杂程度,不用写十几个命名空间了。
    • xmlns:x 表示这个命名空间的别名是x,在使用的过程中可以通过x:Name使用这个命名空间下的对象
    • presentation 是WPF核心命名空间,没有前缀,默认(像Button这种)都在这个命名空间之内
    • xaml 是XAML的命名空间

    不同项目中的命名空间的引用

    xmlns:Prefix="clr-namespace:Namespace;assembly=AssemblyName"
    

    注意AssemblyName是程序集名称,只要在该项目中引用过即可使用。如果就在本程序集中,则可以忽略这个选项。

    // 把当前项目程序集设置为local
    xmlns:local="clr-namespace:MyNamespace"
    

    类名 部分类

    x:Class="Novc.ViPlex.Express.View.AboutView"
    

    这个声明使得XAML生成了一个部分类,与后台的部分类一起构成了完整的窗体类定义

    XAML加载

    InitializeComponent方法

    • 这个方法的作用是加载XAML并且构建用户界面
    • 当自定义构造函数的时候必须写上这个方法

    事件和属性

    XAML加载的顺序是先设置Name属性,再给元素挂载事件,最后加载属性。所以,如果监听了某个属性的变化的事件,在第一次设置该属性的时候(加载属性的时候),事件都会触发一次。

    属性的类型转换器(TypeConverter)

    在XAML中,属性的设置全部是字符串类型的,但是属性的类型却是多种多样的,比如Image的Source是一个BitmapImage类型,VerticalAlignment是枚举类型。为了解决这个问题,.NET引入了类型转换器的概念

    类型转换器存在于

    • 需要设置的属性中,比如 Background 属性
    • 属性设置的值中,比如Background需要使用一个Brush对象,XAML也会检测Brush中是否有类型转换器

    属性的设置

    1. 直接设置属性(使用类型转换器)

      HorizontalAlignment="Left"
      
    2. 设置复杂属性
      属性元素语法,语法规则为Parent.Property,用于设置一个复杂的,对象类型的属性值。

      <Grid HorizontalAlignment="Left" Height="100" Margin="196.617,195.39,0,0" VerticalAlignment="Top" Width="118.795">
          <Grid.Background>
              <LinearGradientBrush>
                  <GradientStop Offset="0.00" Color="Red"></GradientStop>
                  <GradientStop Offset="0.50" Color="Indigo"></GradientStop>
                  <GradientStop Offset="1.00" Color="Violet"></GradientStop>
              </LinearGradientBrush>
          </Grid.Background>
      </Grid>
      
    3. 使用标记扩展设置属性(不太常用,知道即可)

      当我们要给一个属性设置为一个已经存在的属性的时候使用,例如,A类中有一个静态的Brush,B.xaml中需要使用A中的Brush,需要注意的是,A中的Brush必须是静态的,即通过类名就可以访问。

      <Button Foreground="{x:Static SystemColors.ActiveCaptionBrush}"/>
      

      注意上面的语法,Static是StaticExtension的简写,即静态扩展,在后台中这样写

      cmdAnswer.Foreground = SystemColors.ActiveCaptionBrush;
      

      作为嵌套属性这样写,注意需要使用Member:

      <Button.Foreground>
          <x:Static Member="SystemColors.ActiveCaptionBrush"/>
      </Button.Foreground>
      
    4. 设置附加属性

      简单说,附加属性就是一些属性只有在某种特性情况下才能被设置,比如控件在Grid中的时候才能设置Grid.Row。

      这里我们多分析两句,想必设置Grid.Row人人都会,但是为什么它叫附加属性呢?因为TextBox中本来没有这个属性,Background,TextAlignment这种都属于控件的固有属性,而Grid.Row这种是添加进去的。这个属性不在FrameworkElement这样的基类中,而在DependencyObject中有一个字典,这个字典中保存所有扩展属性的Key和Value,因为保存它的是一个字典,所以它可以扩展,那么设置Grid.Row就等价于下面的代码

      txtQuestion.SetValue(Grid.RowProperty, 1)
      

      为什么不写在基类中,要写成这样呢?很简单,因为不是所有的组件都需要这个属性,只有在Grid中的组件有可能需要设置这个属性,所以,做成可扩展的就不扰乱基类,也可以方便扩展。

    元素树

    我们知道元素是以嵌套的方式进行构建的,构建的方式是:

    • 如果父元素实现了IList接口,就调用IList.Add
    • 如果父元素实现了IDictionary接口,就调用IDictionary.Add
    • 如果父元素使用了ContentProperty修饰,子元素设置对应的属性

    我们最需要关注的就是ContentProperty属性,因为ContentControl,ItemsControl,Panel基类都使用ContentProperty特性,这就是说几乎所有的控件都使用ContentProperty,而IList接口的多是属性等,在设置属性的时候可以设置一个集合。

    对于Grid中加入各种元素的情况,并不是因为Grid是IList的集合,Grid支持的是ContentProperty,而能加入很多元素是因为Grid继承自Panel,Grid使用Panel渲染ContentProperty属性,实现可以添加多个元素。Panel有一个Children属性是一个集合,添加元素就是往Children中加入元素,看以下代码

    txtQuestion = new TextBox();
    grid.Children.Add(txtQuestion);
    

    那什么父元素是IList的呢?之前就说过了,比如之前的GradientStopCollection,里面可以添加很多个GradientStop

    对于Grid我们说过了,那对于简单元素,就更简单了。TextBox的ContentProperty渲染的是Text属性,Button的ContentProperty渲染的是Content属性,这里我们要讨论以下Text属性和Content属性的区别了。

    Text 属性和 Content属性

    当我们指定控件中的文字的时候,我们发现有一些控件需要指定Text属性,有一些控件却是要指定Content属性,那么这两个属性有什么区别呢?其实区别很简单,Text属性只能接受string类型的值,那么控件中就只能添加文字,Content属性就比较丰富多彩,可以放各种各样的东西。看下面的例子说明一下。

    <Button>
        <Button.Content>
            <Image Source="/Image/1.jpg"></Image>
        </Button.Content>
    </Button>
    

    实体字符集

    < > " & 这些作为XAML的关键字,不能在XAML中直接显示,当我们要显示这些字符的时候需要用到实体字符标记。
    在这里插入图片描述

    <Button>
        &lt;Click&gt;
    </Button>
    // 显示出来的是<Click>
    

    注意在代码中设置Content不用遵循这个规则,而是需要遵循C#的转义规则。

    空白处理

    默认

    折叠所有空白(打多少空格都只显示一个),如果想要显示所有的空格,有下面三种办法

    1. 在代码中设置的空格多少个都会被保留
    2. 使用 xml:space=“preserve” 属性
    3. 在属性中设置的多少个空格都会被保留
    // 空格会保留
    <TextBlock Text="[1     3      5         7]" />
    
    // 空格会保留
    <TextBox xml:space="preserve">
        1   2   3   4 
    </TextBox>
    // 空格不会保留
    <TextBox>
        1   2   3   4 
    </TextBox>
    

    使用代码控制XAML

    // 加载XAML  XamlReader
    using(FileStream fs = new FileStream(xamlFile. FileMode.Open))
    {
        rootElement = (DependencyObject)XamlReader.Load(fs);
    }
    // 查找元素方法1
    button1 = (Button)LogicalTreeHelper.FindLogicalNode(rootElement, "button1");
    // 查找元素方法2
    FrameworkElement frameworkElement = (FrameworkElement)rootElement;
    button1 = (Button)frameworkElement.FindName("button1");
    

    注意事项

    • 在XAML中加载的类,最好都能有一个无参数的构造函数,这样的类适合XAML的加载
    展开全文
  • 概念 样式是可以应用于元素的一系列属性值的集合。 样式期望使用一份xaml代码来设置一系列元素的细节,比如内外边距,字体颜色等。 样式类似于CSS但是要比CSS更加强大,强大之处在于: 可以设置依赖项属性,使其...
  • WPF允许在代码中以及在xaml中各个位置定义对象资源。 资源集合 在FrameworkElement中定义了一个Resources属性,该属性使用Resource Dictionary类的实例填充,用于存储元素上的资源。根据我们之前学习的体系结构,...
  • 布局原则 空间的尺寸可以自适应。(要实现这样的效果需要不显式的指定控件尺寸,而是设置控件尺寸的最大最小值) 不设置绝对定位,使用相对定位(比如使用margin就是相对定位而非绝对坐标) 布局控件能为子控件合理...
  • WPF高级命令使用

    2021-01-20 19:14:17
    WPF中,命令是什么呢?对于程序来说,命令就是一个个任务,例如保存,复制,剪切这些操作都可以理解为一个个命令。即当我们点击一个复杂按钮时,此时就相当于发出了一个复制的命令,即告诉文本框执行一个复杂选中...
  • WPF中的资源分为两类: 程序集资源 对象资源 其中,程序集资源指的是软件开发中用到的图片,声音,xml文件等资源,这些资源被添加到项目中之后会被嵌入到编译过得程序集中,会被编译成二进制数据。 而对象资源是...
  • WPF高级部分.pdf

    2021-07-14 16:05:25
    Microsoft官方文档,.Net Core版本的官方还在更新中,这是最新的framework部分,当然这并不影响学习,虽是高级部分,但并不难以理解,有C#开发基础便OK。 1积分下载意思下,体现劳动成果
  • WPF高级教程(十八)行为

    千次阅读 2020-03-16 22:55:02
    介绍 在讲解到样式的时候我们说,样式是为了一系列元素共享一些属性而存在的,归根结底是为了复用代码和逻辑,而我们...我们在复用代码的时候,有下面三种方法,他们互相补充,构建了WPF的属性重用架构,在合适的...
  • WPF高级动画

    2021-08-18 19:36:41
    开发工具与关键技术:WPF高级动画 作者:李哲定 撰写时间:2021年8月18日 基本动画我已经会拉,比如按钮宽度动画变动,颜色线性改变,其实动画的类有很多很多,对于高级动画,就是要选择正确的属性去控制元素的变化...
  • Advanced Programming Techniques in MATLAB 1 Agenda MATLAB and memory What you as a programmer should know Passing arrays How structures use memory Functions of all types Introduction/Review of MATLAB
  • WPF高级编程的源码,可以方便直接使用,有源码也能提高学习效率。
  • WPF高级编程源代码

    2010-05-25 16:27:12
    Professional WPF Programming: .NET Development with the Windows Presentation Foundation Chris Andrade, Shawn Livermore, Mike Meyers, Scott Van Vliet ISBN: 978-0-470-04180-2 Paperback 480 pages May ...
  • [Apress] WPF 高级程序设计 (C# 2008 及 .NET 3.5 实现) (英文版) [Apress] Pro WPF in C# 2008 Windows Presentation Foundation with .NET 3.5 (E-Book) ☆ 图书概要:☆ The Microsoft Windows Presentation ...
  • 高级开发书籍原码,学习不可多得的资源,快快下载。
  • 体系结构 控件,窗口,基础形状,样式等都在PresentationFramework...渲染核心,不仅应用于WPF,也应用于系统界面的渲染 WindowsCodecs 图像处理底层API Direct3D 最低级图形渲染API,它是DirectX的一部分 User32 ...
  • WPF高级编程-源代码

    2009-03-24 17:40:19
    WPF高级编程 这本书的源代码,在vs2008下用的话只需要将代码文件复制到新建的项目即可。
  • WPF高级绘图

    2019-04-18 10:01:53
    创建一个Wpf应用程序 首先最外层使用Grid网格布局,使用Grid网格布局把窗体分为四行四列 直线 <Line X1="10" Y1="50" X2="100" Y2="10" Stroke="Blue" StrokeThickness="5"/> 输出结果...
  • 不可错过的一本好书,不看你会后悔的哦,呵呵
  • WPF高级编程源码 欢迎下载,不收资源分
  • Grid是WPF中最强大的布局容器,值得我们专门使用一个专题来了解Grid的使用。 使用 行列定义 <Grid ShowGridLines="True"> <Grid.ColumnDefinitions> <ColumnDefinition></ColumnDefinition&...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,997
精华内容 3,998
关键字:

wpf高级