WPF Q&A

说出使用WPF而不是Windows窗体的一些优点

使用 WPF 代替 Windows 窗体的优点:
XAML 使更容易的创建和编辑 GUI,并允许在设计模式 (XAML) 和后台代码(C#、VB.NET 等)之
间拆分工作。
数据绑定,使开发项目可以更清晰地分离数据和布局。
使用硬件加速来绘制 GUI,以获得更好的性能。

什么是WPF的值转换器?

值转换器充当目标和源之间的桥梁,当目标与一个源绑定数据类型不一致时,需要值转换器来做中转。
例如有一个文本框和一个按钮控件, 当文本框的文本被填充或为空时,希望启用或禁用按钮控件。
在这种情况下,需要将字符串数据转换为布尔值。这可以使用值转换器实现。
要实现值转换器,需要继承System.Windows.Data命名空间中的IValueConverter,并实现两个方法
Convert和ConvertBack。

WPF中控件的分类?

WPF控件可以分为四类:

  • Control: - 大部分时间使用的基本控件。 例如文本框、按钮等。像按钮、文本框、标签等独立控件的控件被称为内容控件。 还有其他控件可以容纳其他控件,例如 itemscontrols。 Itemscontrol可以有多个文本框控件、标签控件等。
  • Shape: - 帮助我们创建简单的图形控件,如椭圆、线条、矩形等。
  • Panel: - 有助于对齐和定位控件。 例如,grid 帮助我们以表格方式对齐,stack panel 有助于水平 和垂直对齐。
  • Content presenter: - 用于将任何 XAML 内容放入其中。

WPF中的命令设计模式是什么

命令设计模式是面向对象设计模式中最强大的设计模式之一。 此模式允许将操作请求与实际执行操作的对象分离,换句话说,命令模式将操作表示为对象。 Command 对象不包含要执行的功能。 这消除了命令定义和功能之间的直接联系,并促进了松散耦合。 当需要根据用户请求实现操作时,命令模式是处理对象的最佳模式。
命令设计模式的成员包括: Client、调用者、命令、具体执行内容、接收者.

描述下WPF对象完整的层次结构?

  • Object: 由于 WPF 是使用 .NET 创建的,因此 WPF UI 类继承的第一个类是 .NET 对象类。
  • Dispatcher: 一个抽象基类,用于绑定到一个线程上的类。与Windows窗体类似,WPF也要求仅从创
    建线程中调用方法和属性。WPF应用程序使用为人熟知的单线程亲和(Single-Thread Affinity,STA)
    模型,这意味着整个用户界面由单个线程拥有。从另一个线程与用户界面进行交互是不安全的。通过
    继承自DispathcerObject类,用户界面中的每个元素都可以检查代码是否在正确的线程上运行,并能
    通过访问调度程序为用户界面线程封送代码。
  • Dependency: 所有支持依赖属性的类的基类。依赖属性可以依赖其他输入,例如主题和用户喜好。
  • 依赖属性与数据绑定,动画,资源和样式一起使用。
  • Visual: 所有可见元素的基类都是Visual。这个类包含点击测试和转换等特性
  • UI Element: 所有需要基本显示功能的WPF元素的抽象基类是UIElement。这个类提供了鼠标移动,
    拖放,按键的通道和起泡事件;提供了可以由派生类重写的虚显示方法;以及布局方法。WPF不再使用
    Window句柄,这个类就可以用Window句柄
  • FrameworkElement: FrameworkElement派生自基类UIElement,实现了由基类定义的方法的默 认代码
  • 最后,所有 WPF 控件 textbox 、 button 、 grids 以及可以从 WPF 工具箱中想到的任何内容都继承自
    FrameworkElement类。

WPF中StaticResource和DynamicResource之间有什么区别?

在实际运行应用程序之前加载 XAML 期间,将解析

StaticResource 并将其分配给属性。 它只会被分配一次,并且忽略对资源字典的任何更改。
DynamicResource 在加载期间将一个 Expression 对象分配给该属性,但直到运行时当Expression 对象被要求提供值时才实际查找资源。 这会导致直到在运动时需要它时才查找资源。
一个很好的例子是对稍后在 XAML 中定义的资源的前向引用。 另一个例子是直到运行时才会存在的资源。 如果源资源字典发生更改,它将更新目标。

.WPF中的命令设计模式和ICommand是什么?

ICommand 是 MVVM 的核心组件。 ICommand 在 MVVM 中经常使用,它提供了View和
ViewModel(用户界面和业务逻辑)之间的分离逻辑。 XAML 提供了一种通过 ICommand 更好地绑定
GUI 事件的方法。 ICommand 要求用户定义两个方法,bool CanExecute 和 void Execute。 CanExecute
方法只是告诉用户,我可以执行这个 Action 吗? 这对于控制 GUI 元素的可操作性非常有用。
ICommand 非常简单,但是也可以完在更加有趣和复杂的功能。 ICommand 将用户界面集成到业务逻
辑中,或者在视图与视图模型之间进行直接通信。 它还为视图提供了更新模型/视图模型的机制。

WPF 中的 ControlTemplate 和 DataTemplate 有什么区别?

通常,控件是为了它自己而呈现的,并不反映底层数据。 例如,一个 Button 不会绑定到一个业务对象
——它在那里纯粹是为了可以点击它。 但是,通常会出现“ContentControl”或“ListBox”,以便它们可以
为用户呈现数据。
因此,“DataTemplate”用于为底层数据提供可视化结构,而“ControlTemplate”与底层数据无关,只是为控件本身提供可视化布局。
“ControlTemplate”通常只包含“TemplateBinding”表达式,绑定回控件本身的属性,而
“DataTemplate”将包含标准绑定表达式,绑定到其“DataContext”的属性(业务/域对象或 查看模型)。

Threads 和 Dispatchers 是什么关系?

WPF 应用程序只有一个 UI 线程来处理所有 UI 交互和用户输入。 还有一个“隐藏”线程负责渲染,但通常
开发人员不会处理它。
Dispatcher / Thread 关系是一对一的,即一个 Dispatcher 总是与一个线程相关联,可用于将执行分派
到该线程。 Dispatcher.CurrentDispatcher 返回当前线程的调度程序,也就是说,当在工作线程上
调用 Dispatcher.CurrentDispatcher 时,将获得该工作线程的调度程序。
Dispatchers 是按需创建的,这意味着如果访问 Dispatcher.CurrentDispatcher 并且没有与当前线
程关联的调度程序,则会创建一个。
应用程序中的调度程序数量始终小于或等于应用程序中的线程数量。

ContentControl 和 ContentPresenter 之间有什么区别?

ContentControl 是包含其他元素并具有 Content 属性(例如, Button )的控件的基类。
ContentPresenter 用于在控件模板中显示内容。
ContentControl ,可以直接使用(它应该用作基类),而 ContentPresenter 用来显示其控件模
板中的内容部分。
个人经验(并非适用于所有情况,请自行判断):

  1. 在 ControlTemplate 中使用 ContentPresenter
  2. 在 ControlTemplate 之外(包括 DataTemplate 和外部模板)尽量不要使用它们中的任何一
    个,如果必须使用,可以 ContentPresenter 优先
  3. 如果需要创建一个承载内容的自定义“无外观”控件,并且无法通过更改现有控件的模板(这应该是
    非常罕见的)获得相同的结果,则可以将 ContentControl 子类化。

为什么需要依赖属性?

主要区别在于,普通 .NET 属性的值是直接从类中的私有成员 读取,而 DependencyProperty 的值在调
用 GetValue( ) 从 DependencyObject 继承的方法。
当设置依赖属性的值时,它不会存储在对象的字段中,而是存储在基类 DependencyObject 提供的键和
值字典中。 条目的键是属性的名称,值是您要设置的值。
依赖属性的优点如下:

  • 减少内存占用

当 UI 控件的 90% 以上的属性通常保持其初始值时,为每个属性存储一个字段是一种巨大的消耗。 依赖
属性通过仅在实例中存储修改的属性来解决这些问题。 默认值在依赖属性中存储一次。

  • 值继承

当访问依赖项属性时,将使用值解析策略来解析该值。 如果没有设置本地值,则依赖属性会向上导航逻
辑树,直到找到一个值。 当您在根元素上设置 FontSize 时,它适用于下面的所有文本块,除非在元素
中覆盖该属性值。

  • 更改通知

依赖属性具有内置的更改通知机制。 通过在属性元数据中注册回调,您会在属性值更改时收到通知。 这
在数据绑定中会使用到。

你可能感兴趣的:(WPF入门,wpf)