含入门 初级 中级 高级 不同级别WPF的面试题
相关面试题
redis安装说明书 http://t.csdnimg.cn/iM260
单体并发瓶颈 redis sqlsever mysql多少 http://t.csdnimg.cn/DTXIh
Redis高频面试题http://t.csdnimg.cn/FDOnv
数据库SqlServer笔试题 数据库SqlServer笔试题-CSDN博客
SQL 大数据查询如何进行优化?sqlserver和oracle整理_sqlerver快速】遍历大数据并计算-CSDN博客
WPF 2024 金九银十 最新 高级 架构 面试题 C# WPF 2024 金九银十 最新 高级 架构 面试题 C#-CSDN博客
问题目录
入门篇
- 什么是 WPF ?
2.WPF 中的 XAML 是什么?为什么需要它?它只存在于 WPF 吗?
WPF****初级篇
1.WPF 中控件的分类 ?
2.XML 和 XAML 有什么区别 ?
3. 如何理解 WPF 的样式
4.WPF 中的资源是什么?
5. 什么是静态资源和动态资源?
6.WPF 中的 Visibility.Collapsed 和 Visibility.Hidden 有什么区别 ?
7.XAML 文件中的 xmlns 是什么?
8.WPF 中的命令设计模式是什么
9.WPF 中的 xmlns 和 xmlns:x 有什么区别 ?
10. 我们什么时候应该使用 "x:name" 和 "name" ?
11. 相对于 Winform , WPF 有什么优势 ?
12. 什么是 WPF 的值转换器 ?
13. 在 WPF 中进行对齐的各种方法是什么?
14. 描述 WPF 中的多段线
15.WPF 提供了哪些不同类型的画刷?
16. 什么是 Popup 对象,以及如何打开和关闭 Popup
17. 什么是 WPF 中的旋转变换
18. 什么是布局容器?
19. 什么是可视化树?
20. 什么是触发器 ?
21. 什么是 MVVM 模式?请简要解释 MVVM 模式的结构和各个部分的职责。
WPF****中级篇
- 描述下 WPF 的总体架构 ?
- 描述下 WPF 对象完整的层次结构 ?
3.WPF 是建立在 Windows 窗体之上的还是完全不同的?
4.Style 和 ControlTemplate 的主要区别是什么 ? - 如何理解 MVVM 中的 View 和 ViewModel?
- 如何在 WPF 应用程序中全局捕获异常?
7.WPF 中的 x:Name 和 Name 属性之间有什么区别?
8.ListBox 与 ListView - 如何选择以及何时进行数据绑定? - 说出使用 WPF 而不是 Windows 窗体的一些优点
10.WPF 中的命令设计模式和 ICommand 是什么? - 什么是可冻结对象?
- 什么是 MVVM?
13.WPF 中可视化树和逻辑树的区别是什么? - 在 WPF 应用程序集中添加新文件时, Page 和 Window 有什么区别?
15.WPF 中的样式和资源有什么区别?
16.WPF 中 Dispatcher 对象的用途是什么 ?
17.WPF 中 StaticResource 和 DynamicResource 之间有什么区别? - 描述下 WPF 中使用的 Prism 框架
19.WPF 中的虚拟化是什么
20.WPF 中有多少种位图效果
21.WPF 有什么优缺点 - 如何理解绑定中的 "UpdateSourceTrigger"?
- 什么是路由事件 ?
24.WPF 中的路由事件和普通事件有何区别? - 什么是数据模板选择器( DataTemplateSelector )?
- 什么是 VisualStateManager ?
27.WPF 中的可视化树有什么作用? - 详细说明下 WPF 中的布局容器?
- 详细说明下 WPF 中的触发器? 30. 什么是 WPF 的 3D ?请简要介绍其特点和用途
- 什么是 UI 虚拟化?它是如何帮助提升 WPF 应用程序性能的?
- 请谈谈你对 WPF 布局系统的理解,以及如何优化布局以提高性能?
- 介绍一下 WPF 中常见的 UI 线程和后台线程之间的通信方式,以及如何避免 UI 线程阻塞?
WPF****高级篇
- 解释 SelectedItem 、 SelectedValue 和 SelectedValuePath 之间的区别?
2.WPF 中的 ControlTemplate 和 DataTemplate 有什么区别?
3.Freezable.Clone() 和 Freezable.CloneCurrentValue() 方法有什么区别?
4.ObservableCollection 和 BindingList 有什么区别? - 冒泡事件和隧道事件之间的确切区别是什么?
6.Threads 和 Dispatchers 是什么关系?
7.ContentControl 和 ContentPresenter 之间有什么区别? - 为什么需要依赖属性?
- 什么是路由筛选器
- 什么是弱事件模式?
- WPF 应用程序的内存优化从哪些方面考虑?
- 请解释 WPF 中的模型( Model )和几何体( Geometry )的区别。
- 谈谈你在 WPF 3D 方面的项目经验,以及你在项目中遇到的挑战和解决方案。
- 介绍一些在 WPF 应用程序中优化视觉效果和动画性能的方法。
- 如何检测 WPF 应用程序的性能瓶颈,并进行性能分析和优化?
入门篇
1. 什么是 WPF ?
WPF ( Windows Presentation Foundation )是一种用于创建 Windows 桌面应用程序的 UI 框架。它提供
了丰富的图形、动画、多媒体和文本处理等功能,使开发人员可以创建出现代化、高效的用户界面。
WPF 使用 XAML ( Extensible Application Markup Language )作为界面定义语言,允许开发人员通过声
明性标记来创建用户界面,而无需编写大量的代码。 WPF 还引入了数据绑定、命令、样式和模板等概
念,使得代码的组织和重用更加容易。
WPF 采用了基于矢量图形的渲染引擎,可以以高质量的方式呈现各种 UI 元素,包括文字、图像、几何形
状等。同时, WPF 还支持 3D 图形、动画、视频和音频等媒体类型,使得开发人员可以创建丰富的交互式
用户界面。
总的来说, WPF 是一种强大、灵活、易于使用的 UI 框架,提供了丰富的功能和工具,使得开发人员可以
创建出现代化的 Windows 桌面应用程序。
2.WPF 中的 XAML 是什么?为什么需要它?它只存在于 WPF
吗?
XAML 是用来组织 WPF UI 的 XML 文件。 以 XML 标签方式表示 UI 的重点是编写一次可以在其他地方运
行它,比如 Blend 软件也能正常加载与编辑。
XAML 不仅仅适用于 WPF 。 XAML 是一种基于 XML 的语言,它有多种变体。
WPF****初级篇
1.WPF 中控件的分类 ? WPF 控件可以分为四类:
Control: - 大部分时间使用的基本控件。 例如文本框、按钮等。像按钮、文本框、标签等独立控件
的控件被称为内容控件。 还有其他控件可以容纳其他控件,例如 itemscontrols 。 Itemscontrol 可
以有多个文本框控件、标签控件等。
Shape: - 帮助我们创建简单的图形控件,如椭圆、线条、矩形等。
Panel: - 有助于对齐和定位控件。 例如, grid 帮助我们以表格方式对齐, stack panel 有助于水平
和垂直对齐。
Content presenter: - 用于将任何 XAML 内容放入其中。
2.XML 和 XAML 有什么区别 ?
以下是 XML 和 XAML 之间的区别:
- 所有 XAML 文档都可以称之为 XML 文档。 然而,反过来说却是不能的。
- XAML 是一种声明性应用程序语言,而 XML 是一种标记语言。
- XML 主要用于 Web 应用程序。 相比之下, XAML 用于设计 Windows 和其他 Web 应用程序的控
件。 - XAML 侧重于对象属性、定义以及它们之间的关系。
- XML 是 W3C 产生的一种标记语言,用于描述其他标记语言。
3. 如何理解 WPF 的样式
WPF 样式的工作方式与 CSS 样式类似
在 CSS 中,我们为控件定义样式,并在应用程序中任何需要的地方重用相同的样式
与 WPF 中的样式允许定义属性并可在应用程序中重用的方式相同。
4.WPF 中的资源是什么?
资源提供了一种简单的方法来重用已定义的对象和值。 WPF 中的资源允许一次设置多个控件的属性。
例如,可以使用单个资源在 WPF 应用程序中的多个元素上设置背景属性。
定义资源的最佳方式是在 Window 或 Page 元素级别。 为元素定义的任何资源也适用于该元素的子元
素。
5. 什么是静态资源和动态资源?
Static Resource - StaticResource 的值在加载时确定
Dynamic Resource - 在运行时更改属性值的情况下使用。
6.WPF 中的 Visibility.Collapsed 和 Visibility.Hidden 有什
么区别 ?
Visibility.Hidden 隐藏控件,但保留它在布局中占用的空间。 所以它呈现空白而不是控件。
Visibilty.Collapsed 不呈现控件并且不保留空格。 控件占用的空间是 " 折叠的 "
7.XAML 文件中的 xmlns 是什么?
"xmlns" 代表 XML 命名空间。 它帮助我们避免 XML 文档中的名称冲突和混淆。
8.WPF 中的命令设计模式是什么 命令设计模式是面向对象设计模式中最强大的设计模式之一。 此模式允许将操作请求与实际执行操作的
对象分离,换句话说,命令模式将操作表示为对象。 Command 对象不包含要执行的功能。 这消除了
命令定义和功能之间的直接联系,并促进了松散耦合。 当需要根据用户请求实现操作时,命令模式是处
理对象的最佳模式。
命令设计模式的成员包括: Client 、调用者、命令、具体执行内容、接收者
9.WPF 中的 xmlns 和 xmlns:x 有什么区别 ?
这两个命名空间都有助于定义 / 解析 XAML UI 元素。
第一个命名空间是默认命名空间,有助于解析整体 WPF 元素。
第二个命名空间以 "x:" 为前缀,有助于解析 XAML 语言定义。
例如,对于下面的 XAML 片段,我们有两个东西,一个是 "StackPanel" ,另一个是 "x:name" 。
"StackPanel" 由默认命名空间解析, "x:name" 由 "xmlns:x" 命名空间解析。
10. 我们什么时候应该使用 "x:name" 和 "name" ?
"x:name" 和 "name" 没有区别, "name" 是 "x:name" 的简写。 但是当对象无法使用 "name" 属性时,就需要
使用 "x:name" 属性。
11. 相对于 Winform , WPF 有什么优势 ?
1 - 绑定(更简约的编码)
2 - 灵活的外观和感受(资源和样式)
3 - 声明式编程 (XAML)
4 - 表现层混合动画(动画开发简单)
5 - 快速加载(硬件加速)
6- 图形硬件无关(分辨率无关)
12. 什么是 WPF 的值转换器 ?
值转换器充当目标和源之间的桥梁,当目标与一个源绑定数据类型不一致时,需要值转换器来做中转。
例如有一个文本框和一个按钮控件, 当文本框的文本被填充或为空时,希望启用或禁用按钮控件。
在这种情况下,需要将字符串数据转换为布尔值。这可以使用值转换器实现。
要实现值转换器,需要继承 System.Windows.Data 命名空间中的 IValueConverter ,并实现两个方法
Convert 和 ConvertBack 。
13. 在 WPF 中进行对齐的各种方法是什么?
FrameworkElement 有两个对齐属性: HorizontalAlignment 和 Vertical alignment 。
Horizontal Alignment 属性是 HorizontalAlignment 枚举的一种类型,表示子元素如何水平放置在父
元素中。
HorizontalAlignment 枚举具有四个属性 Left 、 Center 、 Right 和 Stretch 。 " 左 " 、 " 中 " 和 " 右 " 属性将子元素
设置为父元素的左、中和右。 Stretch 属性拉伸子元素以填充父元素分配的布局空间。
<StackPanel x:Name = "myStack" /> VerticalAlignment 属性是 HorizontalAlignment 枚举的一种类型,表示子元素在父元素中的垂直位
置。
VerticalAlignment 枚举具有四个属性 Top 、 Center 、 Bottom 和 Stretch 。 " 顶部 " 、 " 中心 " 和 " 底部 " 属性将
子元素设置为父元素的顶部、中心或底部。 Stretch 属性拉伸子元素以垂直填充父元素分配的布局空间。
14. 描述 WPF 中的多段线
多段线是由一条或多条直线(或圆弧)线段组成的对象。矩形是您已经熟悉的多段线示例。正如您所看
到的,它是一个可以修改的对象,可以使用比四条单独的线更容易的方式进行操作。
换句话说,多段线是连接直线的集合。 Polyline 对象表示多段线形状,并使用给定点绘制多段线。 Points
特性表示多段线中的点。 Stroke 属性设置颜色, StrokeThickness 表示多段线的线宽。
15.WPF 提供了哪些不同类型的画刷?
画笔和笔是用于绘制和填充图形对象的对象。 WPF 采用 XAML 进行渲染,每个 XAML 控件都有一个 WPF
类。例如, XAML 中的标记和 WPF 中的 SolidColorBrush 类都表示纯色画笔。
在 XAML 和 WPF 模型中,提供了以下画笔对象: - SolidColorBrush
- LinearGradientBrush
- RadialGradientBrush
- DrawingBrush
- Visual Brush
- ImageBrush
16. 什么是 Popup 对象,以及如何打开和关闭 Popup
Popup 是一个浮动在页面或窗口上的窗口,提供一些快速操作的功能。例如,页面或窗口上的登录控件
或控件的动画弹出提示。 XAML 的 Popup 元素表示 WPF Popup 控件。
打开:当 IsOpen 设置为 true 时,弹出控件显示其内容
关闭:当 IsOpen 设置为 false 时, Popup 控件显示其内容。
17. 什么是 WPF 中的旋转变换
RotateTransform 将元素绕点顺时针旋转指定角度。 WPF 中的 RotateTransform 对象表示
RotateTransform 。 Angle 属性表示顺时针旋转的角度(以度为单位)。 CenterX 和 CenterY 属性表示中
心点的 X 和 Y 坐标。默认情况下, ScaleTransform 以点( 0,0 )为中心,该点对应于矩形的左上角。
18. 什么是布局容器?
布局容器是一种 WPF 控件,用于确定子元素在其内部的布局方式和位置。它们包括 StackPanel 、 Grid 、
WrapPanel 等,用于实现不同的布局需求。
19. 什么是可视化树?
可视化树是 WPF 中用于表示界面元素(如控件、容器等)之间层次关系的树结构。它描述了窗口或用户
控件中的所有可见元素以及它们之间的父子关系。可视化树对于布局、渲染和事件传递等方面起着重要
作用。
20. 什么是触发器 ? 触发器是一种用于在特定条件下更改控件外观或行为的机制。 WPF 中的触发器可以基于属性值、数据绑
定、路由事件等进行触发,并允许在特定条件满足时进行样式、模板和触发器的切换。
21. 什么是 MVVM 模式?请简要解释 MVVM 模式的结构和各
个部分的职责。
MVVM ( Model-View-ViewModel )模式是一种用于构建用户界面的软件架构模式。它将应用程序分为
三个主要部分: Model 、 View 和 ViewModel 。 - Model :
Model 代表应用程序的数据模型,负责管理数据的获取、存储、验证及业务逻辑。
Model 通常不直接与视图进行交互,而是由 ViewModel 来访问和操作。
Model 是独立于用户界面的,可以被多个 ViewModel 共享。 - View :
View 是用户界面的展示层,负责在屏幕上呈现数据和接收用户输入。
View 通常是 XAML 文件定义的 UI 元素,如窗口、按钮、文本框等。
View 不应包含任何业务逻辑,只负责将数据从 ViewModel 显示到界面,并将用户输入传递给
ViewModel 处理。 - ViewModel :
ViewModel 充当 Model 和 View 之间的中介,负责处理视图逻辑、数据转换和 UI 交互。
ViewModel 包含了视图所需的数据以及与数据相关的操作,通常实现了命令、属性绑定等功
能。
ViewModel 通过数据绑定与 View 进行通信,将用户输入转换为操作 Model 的指令,同时将
Model 的数据更新反映到 View 上。
MVVM 模式的优势在于清晰地分离了界面逻辑、业务逻辑和数据模型,使得代码更易于维护、测试和扩
展。 ViewModel 作为 View 和 Model 之间的桥梁,降低了耦合度,提高了代码的可复用性。另外, MVVM
还倡导数据驱动的编程方式,通过数据绑定实现了视图与逻辑的解耦,提升了开发效率。
WPF****中级篇
1. 描述下 WPF 的总体架构 ?
User32: 决定了哪个控件显示在屏幕上的哪个位置。
DirectX: WPF 内部使用 DirectX 与驱动程序对话并渲染呈现内容。
Milcore: 媒体集成库。 此部分是非托管代码,因为它充当 WPF 托管和 DirectX/User32 非托管
API 之间的桥梁。
Presentation core : WPF 公开的低级 API ,提供 2D 、 3D 、几何等功能。
Presentation framework: 此部分具有高级功能,如应用程序控件、布局。 帮助您构建应用程序
的内容等。
2. 描述下 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 类。
3.WPF 是建立在 Windows 窗体之上的还是完全不同的?
这两个是完全不同的技术。 它们确实为两个方向提供了一些互操作性层,但除此之外没有任何共同之
处。 Windows 窗体或多或少是 Win32/MFC 之上的轻量级包装器,这意味着它在 .NET 中的可扩展性并
非在所有情况下都那么好。 WPF 是一个从头开始实现的新 UI 框架。 在自定义现有类型时, WPF 也更
加灵活。
WPF 更适合创建 " 华丽 " 的 GUI 。 只是它需要比 WinForms 更新的 .net 框架,并且需要兼容 dx9 或
更高的 GPU 。
WinForms 仍然是一项强大的技术,通常可以以比 WPF 更快的速度开发,但是,最终,这两种技
术都可以用来实现相同的目标。 WinForms 通常用于开发业务应用程序,而 WPF 通常用于创建更
多基于最终用户的软件、应用程序等。
4.Style 和 ControlTemplate 的主要区别是什么 ?
样式在控件上设置属性。
ControlTemplate 是大多数控件的属性,用于指定它们的呈现方式。
详细地说,可以使用一种样式对一组属性的设置进行分组,以便重新使用它来标准化已有控件。 样式可
以在控件上显式设置,也可以应用于所有特定类型。
控件模板可以通过样式设置或在控件上显式设置以更改其显示方式。 所有控件都有嵌入在 .net wpf 程
序集中的默认模板(和样式)。
5. 如何理解 MVVM 中的 View 和 ViewModel?
View 是客户端界面、输入输出界面或用户界面。 收集了窗口、导航页面、用户控件、资源文件、样式和
主题、自定义工具和控件的所有用户界面元素。
View 不知道 ViewModel 和 Model ,反之亦然, ViewModel 和 Model 不知道 View ,并且控件是完全分
离的。
但是 ViewModel 知道 View 的需求。 它们通过数据绑定和依赖属性或多个属性进行通信。
ViewModel 是一个非可视类。 MVVM 设计模式不派生自任何基于 WPF 的类。 ViewModel 不直接知道
View 。 View 和 ViewModel 之间的通信是通过一些属性和绑定进行的。
一个 View-Model 可以连接到多个模型,像一对多关系一样工作,并为 View 封装业务逻辑和数据。
6. 如何在 WPF 应用程序中全局捕获异常?
使用 "Application.DispatcherUnhandledException" 事件。 请注意,仍有一些异常会导致应用程序崩溃,例如在尝试保存到数据库时出现堆栈溢出、内存耗尽或网
络连接丢失等情况。
7.WPF 中的 x:Name 和 Name 属性之间有什么区别?
它们不是同一件事。
x:Name 是一个 xaml 概念,主要用于引用元素。当您为元素提供 x:Name xaml 属性时, " 指定的
x:Name 将成为处理 xaml 时在底层代码中创建的字段的名称,并且该字段保存对对象的引用。 "
MSDN\], 所以,它是一个设计时生成的字段,默认情况下具有内部访问权限。
Name 是 FrameworkElement 对象的现有字符串类型的属性 , 以其他 WPF 元素中都包含此属性 .
因此,这也意味着 x:Name 可以用于更广泛的对象。 这是一种使 xaml 中的任何内容都能够被给定名称
引用的技术。
**8.ListBox** **与** **ListView -** **如何选择以及何时进行数据绑定?**
ListView 是一个专门的 ListBox (继承自 ListBox )。 ListView 允许指定不同的视图而不是直接列表。 可
以滚动自己的视图,也可以使用 GridView (想想类似资源管理器的 " 详细信息视图 " )。 它基本上是多列
列表框,跟 windows 窗体列表视图的表现类似。
如果不需要 ListView 的附加功能,只是显示项目列表(即使模板很复杂),使用 ListBox 就足够了。
**9.** **说出使用** **WPF** **而不是** **Windows** **窗体的一些优点**
使用 WPF 代替 Windows 窗体的优点:
XAML 使更容易的创建和编辑 GUI ,并允许在设计模式 (XAML) 和后台代码( C# 、 VB.NET 等)之
间拆分工作。
数据绑定,使开发项目可以更清晰地分离数据和布局。
使用硬件加速来绘制 GUI ,以获得更好的性能。
**10.WPF** **中的命令设计模式和** **ICommand** **是什么?**
ICommand 是 MVVM 的核心组件。 ICommand 在 MVVM 中经常使用,它提供了 View 和
ViewModel (用户界面和业务逻辑)之间的分离逻辑。 XAML 提供了一种通过 ICommand 更好地绑定
GUI 事件的方法。 ICommand 要求用户定义两个方法, *bool CanExecute* 和 *void Execute* 。 CanExecute
方法只是告诉用户,我可以执行这个 Action 吗? 这对于控制 GUI 元素的可操作性非常有用。
ICommand 非常简单,但是也可以完在更加有趣和复杂的功能。 ICommand 将用户界面集成到业务逻
辑中,或者在视图与视图模型之间进行直接通信。 它还为视图提供了更新模型 / 视图模型的机制。
**11.** **什么是可冻结对象?**
**Freezable** 是一种特殊类型的对象,具有两种状态: *unfrozen* 和 *frozen* 。 解冻时, Freezable 的行为与
任何其他对象一样。 冻结后,无法再修改 Freezable 。
Freezable 提供了一个 changed 事件来通知观察者对对象的任何修改。 冻结 Freezable 可以提高其性
能,因为它不再需要在更改通知上花费资源。 冻结的 Freezable 也可以跨线程共享,而未冻结的
Freezable 则不能。
尽管 Freezable 类有许多应用程序,但 WPF 中的大多数 Freezable 对象都与图形子系统相关。
**12.** **什么是** **MVVM?** MVVM ( Model View ViewModel )是一个在 WPF 中制作应用的框架。 MVVM 与 MVC 框架相同。 它是
一个三层架构,我们可以使用 MVVM 进行松耦合开发。
MVVM 由 John Gossman 于 2005 年推出,当时专门用于 WPF ,作为 Martin Fowler 更广泛的演示模型
模式的具体应用。 基于 MVVM 模式的应用程序的实现使用各种平台功能,这些功能以某种形式可用于
WPF 、 Xarmarin 移动端、 Web 和 Windows 。 许多商业应用程序,包括 Microsoft Expression 产品,
都是在 MVVM 之后构建的。
**MVVM** **的优势**
模块化
测试驱动开发
分离 UI 和业务层作为视图和视图模型。
Page 和 Window 之间的代码共享。
易于维护。
**MVVM** **的特性列表**
它分离了业务层和表示层,如 MVP 和 MVC
改进关注点的结构 / 分离(视图、视图模型和模型)。
实现更好的设计 / 开发人员工作流程。
增强简单性和可测试性。
通过 XAML 支持强大数据绑定功能
无需使用代码隐藏文件
提供多环境的应用开发能力。
强大的数据绑定、命令、验证等等。
设计者和开发者可以一起工作。
**13.WPF** **中可视化树和逻辑树的区别是什么?**
WPF 用户界面的元素是分层相关的。 这种关系称为逻辑树。 一个元素的模板由多个视觉元素组成。 这
棵树被称为 VisualTree 。
**逻辑树** 描述了用户界面元素之间的关系。 逻辑树负责:
继承 DependencyProperty 值
解析 DynamicResources 引用
查找绑定的元素名称
转发路由事件
**视觉树** 包含所有逻辑元素,包括每个元素模板的所有视觉元素。 视觉树负责:
渲染视觉元素
传播元素不透明度
传播布局和渲染变换
传播 IsEnabled 属性。
进行命中测试
相对来源 (FindAncestor)
**14.** **在** **WPF** **应用程序集中添加新文件时,** **Page** **和** **Window** **有**
**什么区别?**
页面旨在用于导航应用程序(通常带有后退和前进按钮,例如浏览器)。 页面必须托管在
NavigationWindow 或 Frame 中。
Windows 只是普通的 WPF 应用程序 Windows ,但可以通过 Frame 容器托管页面。 **15.WPF** **中的样式和资源有什么区别?**
资源用于针对多种类型的控件的属性,而样式一次只能为一种类型的控件定义属性。 我们还可以将不同
的样式定义为一种公共资源的一部分。
这是一个开放式问题。 参考你的经验来提供相关的答案。
**16.WPF** **中** **Dispatcher** **对象的用途是什么** **?**
几乎每个 WPF 元素都具有线程关联性。 这意味着只能从创建该元素的线程访问此类元素。 为此,每个
需要线程关联的元素最终都是从 DispatcherObject 类派生的。 此类提供名为 Dispatcher 的属性,该属
性返回与 WPF 元素关联的 Dispatcher 对象。
Dispatcher 类用于在他的附加线程上执行工作。 它有一个工作项队列,负责在调度程序线程上执行工作
项。
**17.WPF** **中** **StaticResource** **和** **DynamicResource** **之间有什**
**么区别?**
在实际运行应用程序之前加载 XAML 期间,将解析 **StaticResource** 并将其分配给属性。 它只会
被分配一次,并且忽略对资源字典的任何更改。
**DynamicResource** 在加载期间将一个 Expression 对象分配给该属性,但直到运行时当
Expression 对象被要求提供值时才实际查找资源。 这会导致直到在运动时需要它时才查找资源。
一个很好的例子是对稍后在 XAML 中定义的资源的前向引用。 另一个例子是直到运行时才会存在
的资源。 如果源资源字典发生更改,它将更新目标。
**18.** **描述下** **WPF** **中使用的** **Prism** **框架**
Prism 旨在在 WPF 中构建具有单个代码库的应用程序。它有助于以模块化的方式开发客户端应用程序,
以便将大型应用程序的复杂性划分为更简单的模块。
换句话说, " *Prism* 由 *Microsoft Patterns and Practices* 开发,提供指导,旨在帮助您更轻松地设计和构建
丰富、灵活且易于维护的 *Windows Presentation Foundation* ( *WPF* )桌面应用程序。 " 。
以下是基本架构:
1. **App.XAML:** 调用 Application_Startup 上的 Boot Strapper 。
2. **BootStrapper:** 一个调用 Shell ( Shell.XAML )的类文件,从而创建模块目录。
3. **Shell:** 类似一个具有区域的母版页,一个定义区域的容器
4. **Region:** 视图呈现的区域,类似视图占位符
5. **View:** 具有用户界面的 XAML 文件
6. **Module:** 每个模块可以有一个或多个视图,这些视图通过区域管理器注册到区域(在 Shell 中)
**19.WPF** **中的虚拟化是什么**
WPF 中的虚拟化技术提高了 UI 元素的渲染性能。通过应用虚拟化,布局系统确保在屏幕上只呈现容器的
可见项。例如,列表控件可能有数千个项目,但虚拟化将减少对可见项目的渲染。
WPF 中的 VirtualizingStackPanel 控件用于实现虚拟化。 VirtualizingStackPanel 的 IsVirtualizing 属性激活
虚拟化。默认情况下, IsVirtualization 属性设置为 true 。当 IsVirtualization 设置为 false 时,
VirtualizingStackPanel 的行为与普通 StackPanel 相同。 VirtualizingStackPanel.VirtualizationMode 属性有两个值, Standard 和 Recycling 。 VirtualizationMode
的默认值为 Standard ,这意味着 VirtualizingStackPanel 为每个可见项目创建一个项目容器,并在不再需
要时(例如当项目滚动到视图外时)丢弃它。当 ItemsControl 包含许多项时,创建和丢弃项容器的过程
会降低性能。在这种情况下,使用 Recycling 重用项目容器,而不是每次都创建一个新容器。
**20.WPF** **中有多少种位图效果**
位图效果使设计人员和开发人员能够将视觉效果应用于渲染的 WPF 内容。例如,位图效果可以轻松地将
阴影效果或模糊效果应用于图像或按钮。
以下是 WPF 中可用的位图效果:
1. BlurBitmapEffect
2. DropShadowBitmapEffect
**21.WPF** **有什么优缺点**
优点:
丰富的多媒体集成:要在 win32 或 Windows 窗体应用程序中使用三维图形、视频、语音和丰富的文
档查看,需要分别学习几种独立的技术,并在有限的原生支持的情况下将它们融合在一起。 WPF 应
用程序可以在同一个编程模型中使用所有这些功能。
屏幕分辨率无关: WPF 允许您缩小或放大屏幕上的元素,与屏幕分辨率无关。它使用矢量图形使应
用程序的分辨率独立。
硬件加速: WPF 构建在 Direct3D 之上,使用图形处理单元( GPU )而不是中央处理器单元( CPU )
进行图形渲染。这为 WPF 应用程序提供了硬件加速的好处,允许更平滑的图形和增强的性能。
声明式编程: WPF 使用可扩展应用程序标记语言( XAML )声明性编程来定义应用程序对象的布局
和表示三维模型等。这允许设计人员与开发人员直接为同一个 WPF 应用程序进行协同作业。
丰富的组成和定制: WPF 控件易于自定义。您不需要编写任何代码来以非常独特的方式自定义控
件。 WPF 还允许您为外观完全不同的应用程序创建外观。
易于部署: WPF 提供了部署传统 Windows 应用程序的选项(使用 Windows Installer 或 Click
Once )。这一特性并非 WPF 独有,但仍然是该技术的重要组成部分。
国际化与本地化支持:控件中的静态文本和 String 函数的返回数据根据最终用户操作系统指定的区
域性和语言进行修改。
缺点:
WPF 的内置控件远比没有 WinForms 的丰富多样。
WPF 提供了一条新的学习曲线,相比而言 Winform 更简单些
没有 MDI 子窗口模式
**22.** **如何理解绑定中的** **"UpdateSourceTrigger"?**
这是绑定上的一个属性,用于控制从目标到源的数据流,并用于双向数据绑定。默认模式是焦点改变但
有许多其他选项可用时。
UpdateSourceTrigger 提供以下选项:
Default :这是默认值,大多数控件都会失去焦点而触发更新。
LostFocus :直到焦点移出控件时触发更新
PropertyChanged :每当目标属性发生更改时,就会进行值更新。
Explicit :用于延迟源更新,直到用户通过单击按钮等强制执行时进行更新。
**23.** **什么是路由事件** **?** 路由事件是基于控件的层次结构的,是 WPF 提供的一种新的基础结构,它允许事件通过隧道沿视觉树从
根元素向内到达目标元素,或者冒泡到根元素。路由事件与正常事件类似。
路由事件有三种类型,如下所示:
冒泡事件:在控件层次结构中首先引发的隧道事件。这些事件由 Root 元素引发。这允许事件沿树向
下隧穿。
隧道事件:冒泡事件是控件首先引发的事件,而不是控件层次结构中其他控件引发的事件。它允许
泡泡上升到树,直到根元素。首先引发隧道事件,然后引发冒泡事件。
直接事件:直接事件通常由控件本身引发。此事件的行为与 .NET 常规事件相同。
**24.WPF** **中的路由事件和普通事件有何区别?**
WPF 中的路由事件( Routed Event )与普通事件不同,它在整个元素树中的多个元素之间传播,而不仅
仅局限于触发事件的元素。路由事件提供了一种事件系统,可以沿着元素树从源元素到目标元素传播,
以便在不同层次结构上注册和处理事件。
1. 路由事件的传播方式:
冒泡策略( Bubbling ):路由事件从子元素向父元素传播,直到达到根元素为止。例如,当
一个按钮被点击时, Click 事件会先从按钮开始传播到其父级元素,然后传播到更高层级的元
素。
隧道策略( Tunneling ):路由事件从父元素向子元素传播,直到达到源元素为止。例如,当
一个鼠标按下事件发生时, PreviewMouseDown 事件会先从根元素开始向下传播到按钮元
素,然后再传播到更低层级的元素。
直接策略( Direct ):路由事件只在当前元素上触发,并不传播到其他元素。
2. 路由事件的事件处理:
使用 XAML :可以在 XAML 中通过在元素上附加事件处理程序来处理路由事件。例如,使用
Button 按钮的 Click 事件时,可以在 XAML 中添加 Click 事件处理程序,当按钮被点击时将调用
相关方法。
使用代码:也可以通过在代码中为路由事件添加事件处理程序来处理事件。例如,可以使用
Button 的 AddHandler 方法或使用 EventSetter 在样式中设置事件处理程序。
3. 停止路由事件的进一步传播:
在事件处理程序中调用 e.Handled = true; 可以停止路由事件进一步向上传播或向下传播。这
将阻止其他元素上注册的相同路由事件的事件处理程序被触发。
使用隧道策略时,可以在 Preview 事件中停止事件传播,以便只处理预览事件而不触发相应的
普通事件。
通过使用路由事件,开发人员可以更灵活地处理和管理多个元素之间的事件传播和处理。路由事件使得
在 UI 元素层次结构中注册和处理事件变得更加方便和可扩展,同时提供了更多的控制能力和交互性。
**25.** **什么是数据模板选择器(** **DataTemplateSelector** **)?**
数据模板选择器是一种机制,允许根据数据的类型或其他条件选择使用不同的数据模板来呈现数据。它
可以根据特定规则选择合适的数据模板进行数据绑定。
数据模板选择器是一个自定义类,继承自 DataTemplateSelector 基类,并重写其中的 SelectTemplate 方
法。这个方法在数据绑定过程中会被自动调用,用于确定应该使用哪个数据模板。
在 SelectTemplate 方法中,可以根据不同的条件逻辑进行判断,并返回对应的数据模板。您可以根据数
据对象的类型、属性值或其他条件来确定使用哪个数据模板。
**26.** **什么是** **VisualStateManager** **?** VisualStateManager (视觉状态管理器)是在 WPF 中用于管理控件视觉状态和转换的机制。它可以让开
发人员根据不同的控件状态设置相应的可视化属性和样式,并在状态之间实现平滑的过渡。
在 WPF 中,使用 VisualStateManager 通常需要以下步骤:
1. 定义控件的视觉状态:在控件模板( ControlTemplate )中,使用
VisualStateManager.VisualStateGroups 属性定义一个或多个视觉状态组( VisualStateGroup ),
每个视觉状态组表示一组相关的视觉状态。
2. 在每个视觉状态中定义状态的过渡效果:在每个 VisualState 中,可以定义控件在不同状态之间过渡
时的效果。
3. 触发状态转换:在需要触发状态转换的地方,例如鼠标悬停、点击等事件中,使用
VisualStateManager.GoToState 方法切换到指定的视觉状态。
通过上述步骤,我们可以根据控件状态,在不同的视觉状态之间平滑地切换效果。 VisualStateManager
提供了更好的可维护性和可扩展性,使开发人员能够更容易地管理和控制控件的外观行为,并提供更丰
富的用户交互体验。
**27.WPF** **中的可视化树有什么作用?**
可视化树( Visual Tree )是 WPF 中用于表示界面元素之间层次关系的树状结构。它描述了窗口或用户控
件中的所有可见元素以及它们之间的父子关系。可视化树在布局、渲染和事件传递等方面起着重要作
用。
详细说明如下:
1. 树状结构:可视化树是一个树状结构,由一系列相互关联的元素节点组成。每个元素节点代表一个
界面元素,如控件、容器、图形等。
2. 父子关系:可视化树中的节点之间通过父子关系进行连接。每个元素节点都可以有一个父节点和多
个子节点。根节点通常是窗口或用户控件。
3. 可见元素:可视化树只包括可见的元素,即那些 Visibility 属性设置为 Visible 的元素。不可见的元素
(如 Collapsed 或 Hidden )将不会包含在可视化树中。
4. 自动构建:可视化树是在元素被添加到窗口或用户控件时自动构建的。 WPF 框架负责处理元素之间
的父子关系,并确保树状结构正确地反映了界面元素的层次关系。
5. 布局和渲染:可视化树对布局和渲染起着重要作用。当进行布局操作时, WPF 会遍历可视化树,计
算每个元素的大小和位置。随后,渲染操作会遍历可视化树,并使用计算得到的布局信息将元素绘
制到屏幕上。
6. 事件传递:可视化树在事件传递中起着关键作用。当事件被触发时,它会从根节点沿着树的路径向
下传递。 WPF 框架会将事件路由到适当的元素,并找到对应事件处理程序来处理该事件。
通过可视化树, WPF 能够准确地管理界面元素之间的父子关系、布局和渲染过程以及事件的传递。这使
得开发人员可以轻松地构建复杂的界面,实现灵活的布局和交互效果,并提供响应性和可维护性的应用
程序。
**28.** **详细说明下** **WPF** **中的布局容器?**
在 WPF 中,布局容器是一种用于确定子元素在其内部的布局方式和位置的控件。布局容器负责管理和安
排其子元素的大小、位置和层次结构,以便在界面中创建良好的布局。
WPF 提供了多种布局容器,每个容器都有不同的布局方式和特性,可以根据需求选择适当的容器。以下
是几个常用的布局容器:
1. StackPanel (堆栈面板): StackPanel 按照水平或垂直方向依次排列子元素。它可以根据内容自动
调整大小,并根据需要进行换行或溢出。
2. Grid (网格): Grid 将子元素按照行和列的形式进行布局。它允许子元素占据不同数量和大小的单
元格,可以灵活地创建复杂的布局结构。 3. WrapPanel (自动换行面板): WrapPanel 按照水平或垂直方向排列子元素,并在需要时自动换
行。它适用于需要自动适应空间并换行的场景。
4. DockPanel (停靠面板): DockPanel 根据指定的顺序将子元素停靠到容器的边缘。子元素可以停
靠在上、下、左、右或中间位置。
5. Canvas (画布): Canvas 允许通过指定子元素的精确位置来进行布局。它适用于需要自由定位和
控制元素位置的场景,但不提供自动调整和流式布局。
6. UniformGrid (均匀网格): UniformGrid 将子元素均匀地分布在行和列中。它类似于 Grid ,但要
求所有单元格具有相同的大小。
使用布局容器,可以根据需要创建复杂的界面布局并控制子元素的位置和大小。布局容器通过处理各种
布局算法和规则,帮助实现灵活的 UI 设计和适应不同屏幕尺寸的响应式布局。
**29.** **详细说明下** **WPF** **中的触发器?**
触发器( Trigger )是一种用于在特定条件下更改控件外观或行为的机制。 WPF 中的触发器可以基于属性
值、数据绑定、路由事件等进行触发,并允许在特定条件满足时进行样式、模板和触发器的切换。
1. 触发器类型: WPF 中有两种类型的触发器,分别是属性触发器( Property Trigger )和事件触发器
( Event Trigger )。
2. 属性触发器:属性触发器根据绑定对象的属性值来触发相应的操作。当绑定的属性达到指定条件
时,触发器会自动激活。例如,可以使用属性触发器在按钮的 IsEnabled 属性为 true 时改变其背景
颜色。
3. 事件触发器:事件触发器根据绑定对象的路由事件来触发相应的操作。当指定的路由事件触发时,
触发器会执行相应的动作。例如,可以使用事件触发器在按钮点击事件触发时执行一些额外的逻
辑。
4. 触发条件:触发器根据定义的条件来确定何时触发相关的操作。条件可以是一些比较表达式、绑定
值、数据转换器的返回值等。触发器可以根据条件的满足与否来切换控件的外观或行为。
5. 触发操作:触发器可以执行各种操作,如更改控件的样式、模板、属性值等。这些操作可以导致控
件的外观、行为或状态发生变化,从而提供不同的用户体验。
6. 多重触发器: WPF 还支持多重触发器( MultiTrigger )和事件触发器( EventTrigger )。多重触发
器可以在满足多个条件时触发操作,而事件触发器可以根据特定的路由事件来触发操作。
通过触发器,开发人员可以根据特定的条件和事件动态地改变控件的外观和行为,以响应用户的交互和
状态变化。触发器使得界面的自适应和交互性得以实现,同时提高了可维护性和代码的重用性。
需要注意的是,触发器通常与样式( Style )和模板( Template )一起使用,以便在特定情况下自动应用
相应的样式和模板。触发器是 WPF 中强大的功能之一,可以帮助开发人员创建富有动态性和交互性的应
用程序界面。
**30.** **什么是** **WPF** **的** **3D** **?请简要介绍其特点和用途**
WPF 3D 是 Windows Presentation Foundation ( WPF )框架中用于创建和展示三维图形的功能。它使
开发人员能够在 WPF 应用程序中轻松地集成和显示具有逼真视觉效果的三维场景和对象。
特点包括:
**基于** **XAML** **:** WPF 3D 使用 XAML ( Extensible Application Markup Language )来描述和定义三维
场景,使得界面设计更加灵活和易于实现。
**支持数据绑定:** WPF 3D 支持数据绑定功能,可以将三维对象与数据模型相结合,实现动态更新和
交互。
**灯光和材质:** 支持不同类型的灯光和材质,可以为三维对象赋予逼真的光影效果。
**动画和转换:** 提供丰富的动画和转换效果,可以实现三维对象的动态效果和过渡。
**交互性:** 支持用户与三维对象之间的交互,如拖拽、缩放、旋转等操作。
用途包括: **数据可视化:** 可用于创建复杂的数据可视化图表和图形,帮助用户更直观地理解数据。
**虚拟现实应用:** 可用于构建虚拟现实应用程序,如虚拟漫游、虚拟展示等。
**游戏开发:** 适用于开发简单的 3D 游戏或娱乐应用,提供可定制的三维场景和对象。
**产品展示:** 可用于展示产品的三维模型,增强产品展示的吸引力和交互性。
**教育培训:** 可用于创建交互式的教育培训应用,使学习过程更生动和有趣。
**31.** **什么是** **UI** **虚拟化?它是如何帮助提升** **WPF** **应用程序性能**
**的?**
当提到 WPF 中的 UI 虚拟化时,通常指的是对大量数据进行高效显示的技术。在 WPF 中,当需要显示大量
数据(例如列表、表格等)时,如果直接将所有数据项加载到 UI 控件中,可能会导致性能下降和内存占
用过高。这时就需要使用 UI 虚拟化技术来优化性能。
UI 虚拟化的基本原理是:只在屏幕上显示可见区域内的数据项,而不是将所有数据项都加载到内存中并
同时显示。当用户滚动或改变可见区域时,系统会动态地加载新的数据项或卸载不再可见的数据项,以
保持界面流畅和减少内存占用。
具体来说, WPF 中的一些控件(如 ItemsControl 及其派生类)在实现 UI 虚拟化时,会根据可视范围动
态生成和回收数据项的 UI 元素,而不是一次性生成全部数据项的 UI 元素。这样可以有效减少内存占用和
加快界面响应速度。
在面试中,关于 UI 虚拟化的问题可能涉及以下内容:
UI 虚拟化的定义及原理
UI 虚拟化与非虚拟化方式的性能差异
如何在 WPF 中实现 UI 虚拟化
UI 虚拟化对性能的影响和优势
如何处理数据项的动态加载和卸载
**32.** **请谈谈你对** **WPF** **布局系统的理解,以及如何优化布局以**
**提高性能?**
WPF ( Windows Presentation Foundation )中的布局系统是指控件在界面上的排列和定位方式。 WPF
提供了多种布局容器(如 Grid 、 StackPanel 、 Canvas 等)以及强大的布局功能,使开发者能够灵活
地设计复杂的用户界面。
在 WPF 布局系统中,每个控件都可以使用不同的布局容器来实现特定的排列方式。开发者可以通过设置
控件的布局属性(如 Margin 、 HorizontalAlignment 、 VerticalAlignment 等)来控制控件在界面
上的位置和大小。同时, WPF 还支持嵌套布局容器,使得可以创建复杂的布局结构。
为了优化布局以提高性能,开发者可以考虑以下几点:
1. **使用合适的布局容器** :根据界面的需求选择合适的布局容器,避免过度嵌套和不必要的布局结构。
例如, StackPanel 适合一维排列, Grid 适合网格布局。
2. **合理使用布局属性** :避免在每个控件上都设置大量的布局属性,尽量减少布局计算的复杂度。合理
使用布局属性可以提高布局性能。
3. **利用布局缓存** : WPF 会对布局进行缓存以提高性能,但需要注意当控件内容或布局属性发生变化时
要及时更新布局缓存。
4. **避免布局循环** :布局循环指的是控件之间相互依赖导致布局无法正常完成的情况。避免出现布局循
环可以提高性能并避免布局异常。
5. **异步加载布局** :在需要加载大量控件或复杂布局时,可以考虑使用异步加载来提高响应速度和性
能。
6. **减少控件数量** :尽量减少界面上不必要的控件数量,只显示必要的内容,以降低布局和渲染的开
销。 通过合理设计布局结构、优化布局属性的设置、利用布局缓存等方法,开发者可以有效提高 WPF 应用程
序的性能。
**33.** **介绍一下** **WPF** **中常见的** **UI** **线程和后台线程之间的通信方**
**式,以及如何避免** **UI** **线程阻塞?**
在 WPF 应用程序中, UI 线程(也称为主线程)负责处理用户交互、界面更新和渲染等任务,而后台线程
则用于执行长时间运行的任务、 I/O 操作或其他不需要阻塞 UI 线程的工作。为了保持界面的流畅和响应
性,需要在 UI 线程和后台线程之间进行有效的通信,并且避免 UI 线程被阻塞。
以下是 WPF 中常见的 UI 线程和后台线程之间的通信方式,以及如何避免 UI 线程阻塞的方法:
1. **Dispatcher** **(调度器)** :
UI 线程中的每个 UIElement 都关联着一个 Dispatcher 对象,可以通过该对象的 Invoke 或
BeginInvoke 方法将操作推送到 UI 线程执行,从而实现 UI 线程和后台线程之间的通信。
通过 Dispatcher 对象可以将后台线程中的任务安全地调度到 UI 线程执行,例如更新 UI 元素的
属性、触发 UI 事件等。
2. **Task Parallel Library (TPL)** :
使用 TPL 中的 Task 和 TaskScheduler 可以轻松地在后台线程执行任务,并在需要时切换到 UI
线程更新界面。
通过 Task.Run 或 Task.Factory.StartNew 在后台线程执行耗时任务,然后使用
TaskScheduler.FromCurrentSynchronizationContext 切换回 UI 线程执行 UI 更新操作。
3. **Async/Await** **模式** :
使用 async/await 关键字可以方便地编写异步代码,并且自动在 UI 线程和后台线程之间切
换,避免 UI 线程阻塞。
在异步方法中使用 await 关键字可以暂停执行并释放 UI 线程,待异步操作完成后再返回 UI 线
程继续执行。
避免 UI 线程阻塞的方法包括:
**使用异步操作** :将耗时的操作放到后台线程执行,避免在 UI 线程上执行阻塞操作。
**分批加载数据** :对于大量数据的加载或处理,可以分批进行,避免一次性加载过多数据导致 UI 线程
阻塞。
**使用非阻塞的** **API** :尽量使用非阻塞的异步 API 执行 I/O 操作,如异步文件读取、异步网络请求等。
**优化算法和操作** :优化后台线程的算法和操作,尽量减少对 UI 线程的影响。
## **WPF****高级篇**
**1.** **解释** **SelectedItem** **、** **SelectedValue** **和**
**SelectedValuePath** **之间的区别?**
**SelectedItem** 属性返回您的列表绑定到的整个对象。 因此,假设您已将一个列表绑定到一组
Category 对象(每个 Category 对象都具有 Name 和 ID 属性)。 例如。
ObservableCollection\