【整理】【转载】WPF相关问题及答案
1.侵删
2.自己看
3.这个链接也很丰富:https://blog.youkuaiyun.com/weixin_30437481/article/details/99847163
WPF由哪两部分组成
引擎和编程框架。
1.引擎,WPF引擎是基于窗体的应用程序 图形 视频 音频和文档提供了一个单一的运行时库。重要的是WPF基于矢量的呈现引擎使应用程序可以灵活地利用高DPI监视器,支持图形的硬件加速。
2.框架,WPF框架为媒体 用户界面设计和文档提供大量的解决方案。wpf的设计考虑了可扩展性,使开发人员可以完全在WPF引擎的基础上创建自己的控件,也可以通过对现有WPF控件进行再分类来创建自己的控件。
什么是WPF
WPF英文全称是Windows Presentation Foundation,中文为Windows表现层基础。是微软最初在.NET Framework3.5平台推出的一个图形平台。
如何理解WPF体系结构
WPF使用多层架构,类似于三层结构,最顶层部分为托管代码API,此层用于为开发人员编写WPF应用程序提供较高层次的服务,基于C#托管代码编写。转换.NET代码到DirectX的工作由中间层milcore.dll实现。中间层milcore是用非托管代码实现,因为它需要与DirectX紧密集成,对性能敏感,就是消耗的资源比较多,对性能影响较大。
MVVM
MVVM是一种架构模式,我们将项目划分为三个逻辑层,每个层都有自己的职责。
以下是三个逻辑层,并解释了它们的作用:-
V:这一层负责从终端用户获取输入,控件的定位,外观,设计,视觉效果,颜色等。
M:这一层代表你的中间层对象,如客户,供应商等。它处理业务逻辑和与数据访问层的交互。
What are the benefits of MVVM
关注点分离:-由于项目被划分为多个层,每个层都处理自己的职责。这将导致更好的维护,因为当我们更改一个层时,另一个层不会受到影响。
增加用户界面的可重用性:MVVM的全部意义就是去掉代码背后的东西,也就是XAML.CS代码。代码背后的问题是,它是与UI技术联系在一起的,例如ASPX.CS代码是与ASP页面类联系在一起的,XAML.CS文件是与WPF UI技术联系在一起的,等等。所以我们不能在WPF XAML UI的代码后面使用ASPX.CS。
What is xmlns in XAML file
“xmlns”代表XML名称空间。它帮助我们避免XML文档中的名称冲突和混淆。
What is the difference between xmlns and xmlns:x in WPF
命名空间有助于定义/解析XAML UI元素。
第一个名称空间是默认的名称空间,有助于解析整个WPF元素。
xmlns = " http://schemas.microsoft.com/winfx/2006/xaml/presentation "
第二个名称空间以“x:”为前缀,有助于解析XAML语言定义。
xmlns: x = " http://schemas.microsoft.com/winfx/2006/xaml "
例如,对于下面的XAML代码片段,我们有两个东西:一个是“StackPanel”,另一个是“x:name”。
“StackPanel”通过默认名称空间解析,“x:name”通过使用“xmlns:x”名称空间解析。
When should we use “x:name” vs “name”
“x:name”和“name”没有区别,“name”是“x:name”的简写。
但是在您没有找到“name”属性的类中(这是一种罕见的情况),我们需要使用“x:name”属性。
WPF中什么是模板
WPF中模板是用于定义或重定义控件结构,或者说对象的外观。WPF中模板有两类,一个是控件模板(ControlTemplate) 另一个是数据模板(DataTemplate),它们都派生自FrameworkTemplate抽象类。
总共有三大模板 ControlTemplate,ItemsPanelTemplate,DataTemplate。
1 ControlTemplate 主要用途是更改控件的外观。它有两个重要属性:VisualTree(视觉树)内容属性和Triggers触发器,对于触发器可以不用过多考虑,触发器可有可无。VisualTree就是呈现我们所画的控件。Triggers可以对我们的视觉树上的元素进行一些变化。
2 ItemsPanelTemplate 是个特殊的空间模板,主要用来标明多条目控件如何显示它所包含的多项数据。也可以说是指定用于项的额布局的面板。多用于多个内容控件的目标。多为Panel属性或者Panel结尾的属性。
3 DataTemplate 主要用于数据的呈现。也被称为显示绑定数据对象的模板。
你能解释完整的WPF对象层次结构吗
Object: 因为WPF是用.net创建的,所以WPF UI类继承的第一个类是.net对象类。
Dispatcher:这个类确保所有WPF UI对象只能被拥有它的线程直接访问。其他不拥有它的线程必须通过dispatcher对象。
Dependency依赖项:WPF UI元素使用XML格式的XAML表示。在任何给定的时刻,一个WPF元素被其他WPF元素包围,而被包围的元素可以影响这个元素,这是可能的,因为这个依赖类。例如,如果一个文本框被一个面板包围,那么很有可能这个文本框可以继承面板的背景颜色。
Visual:这是一个帮助WPF UI获得其可视化表示的类。
UI元素:这个类有助于实现事件、输入、布局等功能。
Framework element:这个类支持模板、样式、绑定、资源等。
WPF会取代DirectX吗
不,WPF并不会取代DirectX。DirectX仍然需要制作前沿游戏,directX的视频性能仍然比WPF API高出许多倍。所以当涉及到游戏开发时,我们总是倾向于选择DirectX而不是WPF。WPF并不是制作游戏的最佳解决方案,哦,是的,你可以制作TIC/TAC/TOE游戏,但不能制作高动作动画游戏。
有一点要记住,WPF是windows form的替代品,而不是directX。最后,所有WPF控件的文本框,按钮,网格和任何你能想到的从框架元素类继承的WPF工具箱。
What is App.xaml in WPF project
XAML是启动文件或引导strapper文件,它从WPF项目中触发第一个XAML页面。
绑定(Binding )的基础用法
WPF 里分三种:Binding,PriorityBinding,MultiBinding,这三种Binding的基类都是BindingBase,而BindingBase又继承于MarkupExtension。
常见的使用Binding方法是:
1 针对于继承于FrameworkElement控件。 SetBinding(DependencyProperty dp,String path),SetBinding(DependencyProperty dp,BindingBase binding),其中FrameworkElement中SetBinding只对DependencyProperty有效。
2 另一种是 BindingOperations.SetBinding(currentFolder,TextBlock.TextProperty,binding);
BindingOperations.SetBinding的原型是
public static BindingExpressionBase SetBinding(DependencyObject target,DependencyProperty dp,BindingBase binding)
3 清除Binding:
BindingOperations.ClearBinding(currentFolder,TextBlock.TextProperty);//删除currentFolder上的TextBlock.TextProperty绑定
BindingOperations.ClearAllBindings(currentFolder);//删除currentFolder上的所有绑定。
直接对Dependency Property赋值也可以解除binding,不过只对单向binding有效。
Explain the need of binding and commands
WPF绑定帮助在WPF对象之间发送/接收数据,而命令帮助发送和接收操作。发出数据或动作的对象称为源,希望接收数据或动作的对象称为目标。
命令和绑定在MVVM模式中的重要性是什么
命令和绑定帮助您将视图(WPF UI)与视图模型类连接起来,而不需要编写大量的后台代码。
绑定将UI输入元素(文本框、组合框等)与视图模型类属性和UI操作(如单击按钮、右键单击)通过命令连接到类的方法。
Explain delegate command
首先让我们简单地回答:“委托命令使MVVM命令类独立于视图模型”。现在让我们来了解一下长远的道路。
在MVVM架构中,视图与视图模型对话,视图模型与模型对话。当操作从视图发送时,它们被发送到WPF命令以处理事件。WPF命令在内部调用视图模型的方法。
也就是说,命令需要视图模型类的引用。
如果您看到一个典型的WPF MVVM命令,它如下所示。您可以看到在“btnCommand”类中引用的“CustomerViewModel”类。
如果您闭着眼睛思考,那么命令内的“CustomerViewModel”类的引用就是一个问题。这将导致命令类和视图模型之间的紧密耦合。
如果你可视化命令,它只是点击,双击,鼠标左键点击,拖放等。它是用户创建的一个操作。现在,如果我们能将这个命令附加到任何视图模型中,那就不太好了。比如点击事件连接到" CustomerViewModel “或” SupplierViewModel "
// An highlighted block
public class btnCommand : ICommand
{
Private CustomerViewModel Viewobj = new CustomerViewModel();
public btnCommand(CustomerViewModel obj)
{
Viewobj = obj;
}
public bool CanExecute(object parameter) // When he should execute
{
return Viewobj.IsValid();
}
public void Execute(object parameter) // What to execute
{
ViewObj.Add();
}
}
为了将视图模型类从命令中分离出来,我们可以使用委托,例如“Action”和“Func”。如果你看到命令类,我们只需要两个东西“执行什么”和“什么时候执行”。那么如何将这些方法作为泛型委托传递。您可以看到“btnCommand”的构造函数接受两个委托,一个委托执行什么,一个委托何时执行。
在下面的代码中可以看到,“btnCommand”类没有视图模型类的引用,但是有对委托的引用,这些委托只是指向函数/方法的抽象指针。因此这个命令类现在可以附加到任何视图模型类中。这种方法称为“委托命令”。
// An highlighted block
public class btnCommand : ICommand // Step 1 :- Create command
{
private Action WhattoExecute;
private Func<bool> WhentoExecute;
public btnCommand(Action What , Func<bool> When)
{
WhattoExecute = What;
WhentoExecute = When;
}
public bool CanExecute(object parameter) // When he should execute
{
return WhentoExecute();
}
public void Execute(object parameter) // What to execute
{
WhattoExecute();
}
}
Explain one way, two way, one time and one way to source
以上4个方面定义了在应用WPF绑定时数据在目标和源对象之间的流动方式。
Two way:数据可以从源流向目标,也可以从目标流向源。
One way:一种方法:-数据只从源流向目标。
One way to source:数据只从目标流到源。
One time:数据只在第一次从源流向目标时流动,此后不发生任何通信。
“UpdateSourceTrigger”如何影响绑定
“UpdateSourceTrigger”决定在绑定的WPF对象之间更新数据的时间。换句话说,数据应该在丢失焦点事件、数据更改事件等中得到更新。有四种模式可以定义“UpdateSourceTrigger”:
Default:如果它是一个文本属性,那么数据将在焦点丢失期间更新,而对于普通属性,数据将在属性更改事件中更新。
PropertyChanged:在此设置中,一旦值更改,数据就会立即更新。
LostFocus: -在这个设置中,数据会在丢失焦点事件发生时立即更新。
Explicit:在此设置中,数据是手动更新的。
换句话说,要更新两个WPF对象之间的数据,您需要调用以下代码。
BindingExpression binding =txt1.GetBindingExpression(TextBox.TextProperty);
binding.UpdateSource();
要设置“UpdateSourceTrigger”,我们需要使用“UpdateSourceTrigger”值,该值可以在bindings属性中找到
解释“INotifyPropertyChanged”接口的需要
1.当我们绑定两个WPF对象时,目标数据将根据“UpdateSourceTrigger”事件进行更新。请参考前面的问题了解“UpdateSourceTrigger”基础知识。“UpdateSourceTrigger”具有诸如丢失焦点、属性更改等事件。换句话说,当目标上发生lostfocus或属性更改事件时,它会拉动源以获得最新数据。
2.因此,很有可能WPF源数据发生了更改,并且由于WPF目标“UpdateSourceTrigger”事件没有触发,所以他没有执行pull操作,而且源数据与目标数据不同步。这就是“INotifyPropertyChanged”接口开始使用的地方。
因此,从源创建一个push事件,您需要首先实现“INotifyPropertyChanged”接口,如下图所示。现在,当有人调用“Increment”方法时,您可以通过调用“PropertyChanged”函数来引发一个事件,表明“Counter”属性已经更改。
简单地说,源向目标WPF对象发送一个通知,通知源中的数据发生了更改,他应该使用新的数据刷新自己。
属性变更通知(INotifyPropertyChanged 和 ObservableCollection)
1 INotifyPropertyChanged向客户端发出某一属性值更改的通知。
2 ObservableCollection类,它是实现 INotifyCollectionChanged 接口的数据集合的内置实现。表示一个动态数据集合,在添加项、移除项或刷新整个列表时,此集合将提供通知
ResourceDictionary
提供包含元素和 WPF 应用程序的其他元素使用的 WPF 资源的一个哈希表/字典实现。
有利于项目中资源共享。
什么是WPF中的值转换器
1.绑定是WPF的主要特性之一,它帮助我们简化WPF UI和对象之间的数据流。但是,当数据通过这些绑定从源流向UI或反之亦然时,我们需要将数据从一种格式转换为另一种格式。
2.简单来说,我们需要进行数据转换。这可以通过使用“值转换器”实现。为了实现值转换器,我们需要继承“IValueConverted”接口,并实现“Convert”和“ConvertBack”两个方法。
// An highlighted block
public class MaritalConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string married = (string)value;
if (married == "Married")
return true;
else
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
bool married = (bool)value;
if (married)
return "Married";
else
return "UnMarried";
}
}
为什么我们需要在WPF中使用这些可视化和逻辑树的透视图
在处理WPF路由事件时,可视树和逻辑树非常重要
解释WPF中的路由事件
1.路由事件是那些在可视树层次结构中向上或向下移动的事件。
WPF事件可以分为三种类型:
直接事件:-在本例中,事件在源处引发,并在源处本身处理,如“MouseEnter”事件。
冒泡事件:-它们在可视树层次结构中向上移动。例如,“MouseDown”是一个冒泡事件。
隧道事件:这些事件沿可视树层次结构下行。“PreviewKeyDown”是一个隧道事件。
2.WPF中的路由事件是沿着VisualTree传递的,作用是用来调用应用程序的元素树上的各种监听器上的处理程序。
(1)冒泡,这种事件处理方式是从源元素向上级流过去,直到到达根节点即顶层节点,一般为最外层的控件。
(2)直接,这种处理方式是在源上处理,主要用在源元素上处理。通常setter和trigger中有所体现,我个人认为VisualState可视状态可能也是直接事件处理,也是依赖属性的状态改变。和Trigger有一定的重复,但是VisualState是通过生硬的动画间接实现依赖属性的改变。
(3)隧道,又称作Preview事件,和冒泡事件处理方式相反的。元素树的根位置调用事件处理程序,依次向下直到源元素位置。
隧道事件和冒泡事件一般成对出现。同一事件,执行时首先是隧道事件,然后是冒泡事件。
Routed Events(路由事件) 与 Commands(命令)
Event 和 Command 是程序内部通信基础,Routed Events 能够发起多重控件,并且能有序和用户沟通。
Commands是.NET Framework 提供的核心构架,来激活和去除高级别任务。
由此衍生的Animation是events的更进一步。让你能够以友好互动的方式使用Event架构,来使用多重控件。
静态动态区别
静态引用资源只对资源进行一次评估,如果资源发生了更改,那么这些更改不会反映在绑定中。而动态引用资源则在每次需要资源时进行评估。
解释这几个类的作用及关系: Visual, UIElement, FrameworkElement, Control
它们四个的关系:从System.Windows.Controls命名空间中看,依次的继承关系是:
Visual继承UIElement,UIElement继承FrameworkElement,FrameworkElement继承Control。
1 Visual主要作用是为WPF提供2D呈现支持,主要包括输出显示,坐标转换,区域剪切等。
2 UIElement的主要作用是构建WPF元素和基本呈现特征的基类。例如其中定义很多与输入和焦点有关的特性,例如键盘事件,鼠标,还有一些与WPF事件模型有关的API。
3 FrameworkElement的主要作用是为定义的WPF元素添加一些功能。例如,布局定义 逻辑树 对象生命周期事件 支持数据绑定和动态资源引用 支持样式和动画。
4 Control的主要作用是为自定义应用程序控件提供基础。因为它是创建自定义应用程序控件的基类,作用就是可以重写Control类所提供的属性,方法,事件等,为自定义控件添加自定义逻辑。构建WPF应用程序页面的Window类也派生自它。
在WPF中Binding的作用及实现语法
典型的Binding具有四个重要组成部分:Binding目标对象(binding target object) 目标对象属性(target property) Binding数据源(binding source) Path(用于指明要从数据源中取得的值,就是我们通常写的属性名称)。
在WPF中Binding的作用及实现语法
1 XAML是eXtensible Application Markup Language的英文缩写,相应于中文称为可扩展应用程序标记语言,它是微软公司为构建应用程序用户界面而创建的一种新的描述性语言。
2 XAML是XML语言的一个衍生物,它的语法与XML语言完全一致,它的功能就是专门用来设计和实现程序的UI。
3 XAML一个很大的优点就是由于WPF支持WEB开发,那么WEB开发和桌面开发的转换是很简单,修改的地方很短,同时UI与逻辑完全分离,所以逻辑代码也几乎不用改动。
解释什么是依赖属性
1 Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行时 (CLR) 属性的功能,这些服务通常统称为 WPF 属性系统。由 WPF 属性系统支持的属性称为依赖项属性。
依赖属性和以往属性的不同之处和优点
(1)依赖属性是一种特定类型的属性。这种属性的特殊之处在于,其属性值受到 Windows 运行时中专用属性系统的跟踪和影响。
(2)依赖属性的用途是提供一种系统的方式,用来基于其他输入(在应用运行时其内部出现的其他属性、事件和状态)计算属性的值。
(3)依赖属性代表或支持编程模型的某种特定功能,用于定义 Windows 运行时应用,这种模型使用 XAML 编写 UI,使用 C#、Microsoft Visual Basic 或 Visual C++ 组件扩展 (C++/CX) 编写代码。
一般的属性没有这么复杂。
(4)优点
(1)优化了属性的存储,直接减少了不必要的内存使用。
(2)有属性变化通知 限制 验证等。
(3)可以储存多个值,配合Expression及Animation等,打造出更灵活的使用方法。
视觉树 VS 逻辑树
1 逻辑树是视觉树的子集,也就是视觉树基本上是逻辑树的一种扩展。
2 WPF通过逻辑树来解决依赖项属性继承和资源的问题,使用视觉树来处理渲染,事件路由,资源定位等问题。
3 逻辑树可以认为是XAML所见的,而视觉树包含了XAML元素内部的结构。
4 逻辑树的查找可以通过LogicalTreeHelper辅助类,视觉树的查找可以通过VisualTreeHelper辅助类,其中需要注意的是对ContentElement元素的查找,无法直接通过VisualTreeHelper进行查找,ContentElement元素并不继承Visual,而ContentElement元素的使用时需要一个ContentElement载体FrameworkContentElement。