第514篇--Interview Summary (WPF)

WPF面试基本问题

1 DP

WPF 面试:(WPF) 提供了一组服务,这些服务可用于扩展公共语言运行时 (CLR) 属性的功能。这些服务通常统称为 WPF 属性系统。由 WPF属性系统支持的属性称为依赖项属性, 依赖项属性提供用来扩展属性功能的功能, 最常用的莫过于“数据绑定”功能. 依赖属性可支持WPF中的样式设置、数据绑定、继承、动画及默认值。依赖项属性是通过调用 Register 方法(或RegisterReadOnly)在 WPF 属性系统中注册,并通过 DependencyProperty 标识符标示属性。 依赖项属性只能由继承自

 

DependencyObject 类的类型使用,但 DependencyObject 在 WPF 类层次结构中的级别很高,因此,WPF 中的大多数可用类都支

 

持依赖项属性

什么时候用?

应用依赖属性的场景:

1. 希望可在样式中设置属性。

2. 希望属性支持数据绑定。

3. 希望可使用动态资源引用设置属性。

4. 希望从元素树中的父元素自动继承属性值。

 

比如:A的SizeChanged事件中添加处理图片B的方法。把图片A的Size赋给图片B. 用Binding一下可解决:

imageB.DataContext = imageA;

imageB.SetBinding(Image.WidthProperty, "Width");

imageB.SetBinding(Image.HeightProperty, "Height");

 

与普通属性的区别:

与普通属性的主要区别在于:

 

1. 字段必须为static,且类型为DependencyProperty,字段名需遵守命名约定,即后缀为Property;

2. 字段的修饰符须设置为Public,否则在外部不能通过SetBinding方法,绑定此属性的值;

3. 字段的值通过DependencyProperty.Register来设置,各参数的说明详见代码中的说明;

.NET属性有什么不同                                                    

 

l         定义方式,依赖属性DependcyObject无public的方法,避免实例化,这就需要依赖属性采用一种注册的方式定义。

l         优化存储,较少开销(GetValue,SetValue内部使用了一个高效的存储结构),并且依赖属性为静态字段,较少内存

 

分配的空间。

它和传统属性的区别在哪里,为什么要搞出这样一个DP呢?第一,内存使用量。我们设计控件,不可避免的要设计很多控件的属性,高度,宽度等等,这样就会有大量(私有)字段的存在,一个继承树下来,低端的对象会无法避免的膨胀。而外部通过

 

GetValue,SetValue暴露属性,内部维护这样一个EffectiveValueEntry的数组,顾名思义,只是维护了一个有效的、设置过值的列表,可以减少内存的使用量。第二,传统属性的局限性,这个有很多,包括一个属性只能设置一个值,不能得到变化的通知,无法为现有的类添加新的属性等等。

 

它又有自己的优先级,Local>Style>Template…这里就不详细解释了

local value>style trigger>template trigger>…

 

2 什么是Attached property?

 

什么是样式?

wpf提供了一种类似css的对象- style,但是比css更强大。它支持直接设定属性,更改呈现模板,触发器,事件触发等

 

4 什么是模板?

在WPF中有三大模板ControlTemplate,ItemsPanelTemplate,DataTemplate.其中ControlTemplate和ItemsPanelTemplate是控件模板,DataTemplate是数据模板,他们都派生自FrameworkTemplate抽象类。

1)     需要修改一个控件的外观, 这个控件可能是1) WPF内建的控件, 比如你对默认的Button外观不爽了, 想把它换成一些别的什么, 比如一张图片或一个矩形. 2) 用户自建的控件, 它默认是什么都没有, 你得用模板使它可视化.

2)     需要为一种不可见的数据类型提供外观. 比如如果你把一个DateTime的对象作为Button的内容, 因为DateTime并不是一个可视的元素(UIElement), WPF会默认把其渲染成string; 为了提供更好的用户体验, 我们可以给它添加一个模板, 以控制WPF对

 

DateTime对象的渲染

 

 

 

5 数据binding?

数据绑定是在应用程序 UI 与业务逻辑之间建立连接的过程.要使用 WPF 数据绑定功能,您必须始终要有目标和源。绑定的目标可以是从 DependencyProperty 派生而来的任何可访问属性或元素,例如 TextBox 控件的 Text 属性。绑定的源可以是任何公共属性

 

6 继承关系?

DispatcherObject-->DependencyObject-->Visual-->UIElement-->FrameworkElement.

WPF建立在dispatcher提供的消息系统之上。它的工作方式很像win32中的消息泵;事实上,WPF的dispatcher使用User32消息来实现线程间调用。

DependencyObject: 属性系统.Visual对象是WPF的核心对象,其主要角色是提供呈现支持。用户控件,如按钮Button和文本框TextBox,都从Visual类继承,并使用Visual定义的属性来维持它们的呈现数据, 击测试(Hit testing):  检测一个指定的坐标(点)或几何对象是否在指定的可视化对象之范围内。

UIElement: 键盘事件,鼠标和笔输入的支持.

FremaeworkElement: 布局定义、逻辑树、对象生命周期事件、支持数据绑定和动态资源引用、支持样式和动画。 Control是创建自定义应用程序控件的基类。开发人员可通过重写Control类所提供的属性,方法,事件等,为自定义控件添加自定义逻辑。

 

7 逻辑树 VS 视觉树?

几乎WPF的每个方面(如属性、事件、资源等等)都有依赖逻辑树的行为。例如,属性值有时候会自动沿着逻辑树向下传导,并且可以沿着逻辑树向上或向下触发事件。

并不是所有的逻辑树节点都会出现在视觉树中,只有那些从ystem.Windows.Media.Visual或从System.Windows.Media.Visual3D派生的元素才会.资源通过逻辑树查找路由事件的事件路由特性大多数遍历可视化树。

 

8 三种属发器?

属性触发器仅仅是WPF支持的3种触发器之一,数据触发器是属性触发器的另一种形式,它可以在任何.NET元素中工作,而不仅仅是依赖属性中。  事件触发器会通过声明方式指定动作,该动作在路由时间触发时生效。

 

9 依赖属性和附加属性的区别?

DependencyProperty.Register

RegisterAttached

 

Attached Property

> 附加属性是XAML定义的一个概念.附加属性旨在用作可在任何对象上设置的一类全局属性.在 WPF中,附加属性通常定义为没有常规属性“包装”的一种特殊形式的依赖项属性.

 

 

9 属性变更通知(INotifyPropertyChange ObservableCollection) .

INotifyPropertyChange(System.ComponentModel)向客户端发出某一属性值更改的通知。PropertyChangedObservableCollection<T>类,它是实现 INotifyCollectionChanged 接口的数据集合的内置实现。表示一个动态数据集合,在添加项、移除项或刷新整个列表时,此集合将提供通知

 

10 路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件。实现定义:路由事件是一个 CLR 事件,可以由 RoutedEvent 类的实例提供支持并由 Windows Presentation Foundation (WPF)

事件系统来处理.冒泡事件是WPF路由事件中最为常见,它表示事件从源元素扩散(传播)到可视树,直到它被处理或到达根元素。这样您就可以针对源元素的上方层级对象处理事件, 隧道事件带有前缀 Preview.

 

11 自定义:首先使用 RegisterRoutedEvent 方法注册一个 RoutedEvent按照约定,RoutedEvent 静态字段名称应当以后缀Event 结束。在本示例中,事件的名称是 Tap,事件的路由策略是 Bubble。在注册调用之后,可以为该事件提供添加和移除公共语言运行时 (CLR) 事件访问器。

12 Commands (命令)作用和好处

l         减少业务代码与UI的耦合度。

l         Command可以集中管理不同操作。

l         Command既和操作关联,又和界面关联。

RelayCommand: Execute, CanExecute

 

13  CLR事件的区别

CLR事件,可以与一个或多个元素相关联,但是每个关联的元素需要显示进行订阅事件,否则CLR将忽略该对象。WPF路由事件提供一中不同的机制,路由事件可在WPF元素树上进行向上或向下的传递,无论元素是否关联订阅,位于元素树上下级事件都有机会处理事件。

 

14 UserControl 派生, WPF 中创建控件的最简单方法是从 UserControl 派生

 

15 工作线程更新UI

  //正确的写法:通知主线程去完成更新

            new Thread(()=>{

                this.Dispatcher.Invoke(new Action(()=>{

                    progressBar1.Value=20;

                }));

            }).Start();

 

16 开发WPF流程?

这个没有Photoshop好用,会限制我的灵感”, “他们生成的XAML太糟糕了...”。确实,在同一项目中,设计人员使用Blend进行设计,开发人员用VS来开发代码逻辑,这个想法稍有理想化:

有些UI效果是很难或者不可以用XAML来描述的,需要手动编写效果

 

17 MVVM自从提出,就获得了好评.

1) 使代码更加干净,我没使用简洁这个词

2) 可测试性

3) 使用Attached Behavior解耦事件, 这里提供了一个Attached Behavior模式,目的很简单,就是要注册控件的Event,然后在

Event触发时时候调用Command

 

18 WPF团队合作?

六种角色:

  专业美工人员:整个系统的基调与样式、页面布局图、页面效果图、页面的样式与颜色、常用按钮图标、常用图标图片等等。

  XAML人员:Style,Template,Trigger,Resource用XAML代码书写,另外强调和美工及ViewModel人员的交互与合作。

  ViewModel :主要封装领域模型暴露的接口,然后提供给View,所以这里强调UI和领域模型的一个适配作用。领域模型(核心):应用程序的核心,必须投入大量精力,按照面向对象的分析和设计 (OOAD) 最佳做法进行设计同时按照OOP进行开发。

  框架+常用功能开发人员:这里就包括MVVM框架的开发、维护以及扩展,同时还包括数据底层访问、日志、异常、常用功能等

  数据库开发和管理人员:数据库库表的建立及维护、数据库脚本的创建及维护、数据库优化以及日常的数据操作问题

 

 

19 Prism——之前又叫Composite Application Guidance for WPF and Silverlight,它是构建复杂的基于WPF/Silverlight企业级

应用的主流框架。Prism中有几个比较重要的概念:

  1,BootStrapper:应用程序切入点,继承Prism的UnityContainer或MEF提供的MefUnityContainer,为系统提供一个容器。

  2,Shell:它是一个外壳,通过UI元素和Region布局页面。 它是应用程序的顶级窗口,显示的内容一般就由View来填充,Shell本身并不知道它包含了哪些内容,所以功能则是由各个Module来具体提供。

  3,View:它等同于MVP模式、MVVM模式中的View。可以通过IRegionManager注入到Region中。

  4,Module:可以把一个大项目拆分开来,每一个Module都包含View、数据、模型,主要用于实现复杂业务操作。

  5,IModuleManager:主要用于管理模块加载,可以实现动态加载。

  6,IEventAggregator:事件处理接口,实现订阅和发布模式,这也是MVVM框架的一般做法。

  Prism是一个比较庞大的组合框架,4.0引入MEF及功能调整以后变得更加强大了,现在可以说是组合框架和应用框架的统一体,且是微软团队的力量,所以选它是值得保证的。

 

20 动画?

Animation,它必须满足以下条件:

1,它必须是Dependency Property

2,它所在类必须继承于DependencyObject,必须实现了IAnimatable接口.

3,必须有类型一致的Animation Type(即Color类型使用ColorAniamtion,Point类型使用PointAnimation等)

 

21 SilverLight可以看作是WPF的一个简化版本,或者一个轻量版本。

SilverLight是基于浏览器插件的,在浏览器中运行,服务器端不需要部署任何环境,客户端只需要安装Runtime浏览器插件,无须安装.net Framework 3.0。所以,SilverLight的运行环境不受操作系统和浏览器的种类限制(更准确的说,是受到较少的限制)。

WPF可以编写Web程序或者桌面应用程序,可以直接编译为独立运行的.Exe文件。WPF运行时必须安装.net Framework 3.0。这就要求WPF目前运行的操作系统必须是Windows Vista或者Windows XP SP2。

 

 

 

22性能调优?

1) 我们应该使用动态的ObservableCollection对象绑定。而不是直接的更新ItemSource。

2) 在自定义控件,尽量不要在控件的ResourceDictionary定义资源,而应该放在Window或者Application级。因为放在控件中会使每个实例都保留一份资源的拷贝

3) 尽量多使用Canvas等简单的布局元素,少使用Grid或者StackPanel等复杂的,越复杂性能开销越大。

4) 把属性注册为DependencyProperty会有很多的优点:比如继承、数据绑定和Styl

 

23WPFmain方法?

自动手成的App.g.cs文件里有Main方法。

StartupUri="Window1.xaml"

Startup="MyApplication_Startup"

 

http://www.cnblogs.com/zhouyinhui/archive/2008/01/17/1042740.html

WPF好文:http://www.cnblogs.com/Zhouyongh/archive/2009/07/31/1536000.html

WPF性能调优:http://www.cnblogs.com/YilingLai/archive/2007/01/19/624714.html

posted @ 2013-03-13 23:35  Shanghai Jim Zhou  阅读(354)  评论(0编辑  收藏  举报