WPF面试题问答
问题1:什么是WPF?
答: WPF 代表 Windows Presentation Foundation。这是对使用 WPF 的桌面应用程序 UI 的重新发明。除了像开发人员多年来一直在做的那样在“ Windows 窗体 ”上删除控件之外,WPF 还为应用程序开发提供了额外的快速推动力,包括丰富的用户界面、动画等等。
简而言之,使用 WPF 可以完成以下操作:
- 绘制普通控件和图形。
- 可以轻松加载/播放音频和视频文件。
- 可以提供平滑的图形效果,例如阴影和颜色渐变。
- 可以使用可跨相同控件使用的共享样式,以提供相同的主题、皮肤和设计。
- 变换对象,包括形状、控件和视频。
- 可以创建和动画 3D 图形。
- 可以轻松绘制缩放的矢量图形而不会出现锯齿状锯齿。
好处
- 紧密的多媒体集成
- 分辨率独立性
- 硬件加速
问题 2:WPF 中的内容对齐是什么?
答:WPF 中内容控件的内容是使用各种属性来处理的。这两个属性是 HorizontalContentAlignment 和 VerticalContentAlignment 。这些属性在 System.Windows.Controls.Control 类中定义,该类是 WPF 中所有控件的父类。
如果我们创建一个带有 Button 和 TextBox 控件的 UI,UI 如下图所示,其中 Button 的内容默认垂直和水平对齐方式为居中。TextBox 内容的默认垂直和水平对齐方式是左上角。
您想将 Button 和 TextBox 的内容设置为底部和右侧。
代码将 VerticalContentAlignment 和 HorizontalContentAlignment 属性 设置为底部和右侧。
<Grid Name="StackPanel1" Background="LightGray">
<Button Name="Button1" Background="LightBlue" Height="45" Content="Click Me!" Margin="23,12,159,0" VerticalAlignment="Top" FontSize="16" FontWeight="Bold" VerticalContentAlignment="Bottom" HorizontalContentAlignment="Right" />
<TextBox Height="50" Margin="26,72,74,0" Name="textBox1" VerticalAlignment="Top" Text="I am a TextBox" FontSize="16" VerticalContentAlignment="Bottom" HorizontalContentAlignment="Right" />
</Grid>
如图所示的输出:
问题 3:WPF 中的资源是什么?
答: Windows Presentation Foundation (WPF) 资源提供了一种简单的方法来重用常用定义的对象和值。WPF 中的资源允许您一次设置多个控件的属性。例如,您可以使用单个资源在 WPF 应用程序中的多个元素上设置背景属性。
定义资源的最佳方式是在 Window 或 Page 元素级别。您为元素定义的任何资源也适用于该元素的子元素。例如,如果您为具有 Grid 作为子元素的 Window 元素定义资源,则为 window 元素定义的资源也可以被 grid 元素使用。但是,如果您为网格元素定义资源,则该资源仅适用于网格元素的子元素。
WPF 中资源的语法,
<elementName propertyName="{markupExtension keyName}">
<!-内容 -->
</元素名>
在哪里,
- elementName: 使用资源的元素的名称。
- propertyName: 从资源中获取其值的属性的名称。
- markupExtension: 定义资源的类型。
- keyName: 资源的键名,用于标识资源的唯一字符串。
有两种类型的资源,即,
- 静态资源
- 动态资源
问题4:什么是静态资源和动态资源?
有两种类型的资源,即,
- 静态资源
- 动态资源
让我们看看这两种资源的基础知识,
静态资源
我们应该使用 StaticResource 标记扩展来将资源定义为静态资源。StaticResource 的值在加载时确定。
让我们有一个示例程序,在 Grid 内的 Window1.xaml 文件中添加以下代码片段。
<Grid.Resources>
<SolidColorBrush x:Key="lblbgcolor" Color="
Blue"/>
</Grid.Resources>
<Label Name="lbl" Margin="71,44,77,0" Background="{StaticResourcelblbgcolor}" Height="49" />
上面的代码,Grid 控件使用 Resources 属性 (<Grid.Resources>) 来定义资源。定义了名为 lblbgcolor 的 SolidColorBrush 资源。lblbgcolor 资源用于设置标签的背景属性。
动态资源
我们在想要在运行时更改属性值的情况下使用动态资源。
让我们有一个示例程序,在 Window1.xaml 文件中的 Window 元素内添加以下代码片段。
<Window.Resources>
<SolidColorBrush x:Key="brush" Color="Red" />
</Window.Resources>
<Button x:Name="btn" Content="Click Me" Click="Button_Click" Background="{DynamicResource brush}" Height="100" Width="100" />
打开后面的代码并添加以下代码片段。
private void Button_Click(object sender, RoutedEventArgs e)
this.btn.SetResourceReference(BackgroundProperty, "brush");
在上面的代码中,Window 控件使用 Resources 属性 (<Window.Resources>) 来定义资源。定义了名为画笔的 SolidColorBrush 资源。画笔资源用于设置按钮的背景属性。
问题 5:WPF 中的值转换器是什么?
答: 值转换器充当目标和源之间的桥梁,当目标与一个源绑定时,它是必需的,例如您有一个文本框和一个按钮控件。您希望在文本框的文本已填充或为空时启用或禁用按钮控件。
在这种情况下,您需要将字符串数据转换为布尔值。这可以使用值转换器来实现。 要实现值转换器,需要从System.Windows.Data 命名空间中的 I 值转换器 继承并实现 转换 和 转换回 两个方法。
注意: 在 WPF 中,绑定有助于在两个 WPF 对象之间流动数据。发出数据的绑定对象称为源,另一个(接受数据)称为目标。
例子
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace ValueConverters
public class ValueConverter: IValueConverter
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
bool isenable = true;
if (string.IsNullOrEmpty(value.ToString()))
isenable = false;
return isenable;
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
throw new NotImplementedException();
问题 6:什么是 MVVM?
答:MVVM(Model View ViewModel)是在WPF中制作应用程序的框架。MVVM 与 MVC 框架相同。它是一个三层架构加上一层。我们可以使用 MVVM 进行松散耦合。
MVVM 由 John Gossman 于 2005 年引入,专门用于 WPF,作为 Martin Fowler 更广泛的演示模型模式的具体应用。基于 MVVM 模式的应用程序实现使用各种平台功能,这些功能以某种形式可用于 WPF、Silverlight 桌面/Web 和 Windows。许多商业应用程序,包括 Microsoft Expression 产品,都是在 MVVM 之后构建的。
MVVM的优势
- 模块化
- 测试驱动的方法。
- 分离 UI 和业务层作为视图和视图模型。
- 页面和表单之间的代码共享。
- 易于维护。
MVVM 的功能列表
- 它将业务层和表示层分开,例如 MVP 和 MVC。
- 改进关注点的结构/分离(视图、视图模型和模型)。
- 启用更好的设计/开发人员工作流程。
- 增强简单性和可测试性。
- 由 XAML 的强大数据绑定功能启用。
- 无需使用代码隐藏文件(极简代码隐藏文件)。
- 提供多种环境的应用开发能力。
- 强大的数据绑定、命令、验证等等。
- 设计者和开发者可以一起工作。
推荐一款WPF MVVM框架开源项目:Newbeecoder.UI

Demo下载:
问题 7:如何解释 MVVM 中的视图和视图模型?
答: 视图是客户端界面、输入输出界面或用户界面。它收集了窗口、导航页面、用户控件、资源文件、样式和主题、自定义工具和控件的所有用户界面元素。视图不知道 ViewModel 和 Model,反之亦然,ViewModel 和 Model 不知道 View 并且控制是紧密解耦的。
但是视图模型知道视图的需求。它们通过数据绑定和一个或多个依赖属性进行通信。
MVVM 中的视图模型
ViewModel 是一个非可视类。MVVM 设计模式不派生自任何基于 WPF 或 Silverlight 的类。ViewModel 不直接感知视图。View 和 ViewModel 之间的通信是通过一些属性和绑定来实现的。模型直接连接到 ViewModel 并通过模型类调用方法,它知道模型有什么,如属性、方法等,也知道视图需要什么。
一个 View-Model 可以连接到多个模型,像一对多的关系一样工作,并为 View 封装业务逻辑和数据。ViewModel 继承了一些接口,如 INotifyPropertyChanged 、 icommand INotifyCollectionChanged 等。
问题8:WPF中的Command Design Pattern和ICommand是什么?
答: 命令模式是面向对象设计模式中最强大的设计模式之一。此模式允许您将操作的请求与实际执行操作的对象分离,换句话说,命令模式将操作表示为对象。Command 对象不包含要执行的功能。这消除了命令定义和功能之间的直接联系,并促进了松散耦合。当您想根据用户请求实现操作时,命令模式是处理您的对象的最佳模式。
以下是命令设计模式的成员:
- Client
- Invoker
- Command
- Concrete Command
- Receiver
命令设计模式的流程
指令
ICommand 是 MVVM 的核心组件。ICommand 在 MVVM 中经常使用,它提供了视图和视图模型(用户界面和业务逻辑)之间的分离逻辑。XAML 提供了一种通过 ICommand 更好地绑定 GUI 事件的方法。ICommand 要求用户定义两个方法, bool CanExecute 和 void Execute 。CanExecute 方法真的只是对用户说,我可以执行这个动作吗?这对于控制可以执行 GUI 操作的上下文很有用。
ICommand 非常简单,但是当您在应用程序中使用它时会更加有趣和复杂。ICommand 将您的用户界面集成到业务逻辑或在视图与视图模型之间进行直接通信。它还为视图提供了一种更新模型/视图模型的机制。
问题 9:什么是 Data Binding 概念以及 Binding 在 WPF 中是如何工作的?
答: 与 .NET 中的其他传统 Web 和 Windows 应用程序技术相比,数据绑定是 XAML(WPF、Silverlight、Windows Phone 或 Windows 8)最伟大和最强大的功能之一。有用于显示单个值的简单数据绑定,以及用于显示和格式化一堆数据的复杂数据绑定。然而,XAML(WPF、Silverlight、Windows Phone 或 Windows 8)可以轻松地将几乎任何属性绑定到任何元素或对象或数据源。您从某个属性或对象或依赖项属性中获取数据,并将其绑定到另一个依赖项属性或对象,或者直接绑定到一个元素。一句话,您可以在 XAML 中说“ 数据绑定是从一个对象获取信息到另一个对象并将其显示在用户界面的一个或多个元素中的过程 ”。
{Binding} 在 WPF 中的工作原理
Binding 关键字如下图所示。这是 TextBox UI 控件与一些绑定属性源对象的绑定。
从后面的代码绑定到 WPF 元素。
在上面的示例中,使用某些绑定属性的代码后面的文本框和滑块。
绑定类的一些非常有用的属性
属性名称 | 描述 |
Element Name | 绑定到 XAML 元素时获取或设置绑定源对象的元素的名称。 |
FallbackValue | 设置绑定不返回值时使用的值。 |
Converter | 设置 UI 元素的转换器。 |
Mode | 设置目标和源对象之间的 Binding diction。 |
Path | 获取或设置绑定源的源属性的路径。 |
RelativeSource | 通过指定绑定源的位置和相对于绑定目标的位置来获取或设置绑定源。 |
Source | 获取或设置未绑定到 WPF 元素时的绑定源。 |
StringFormat | |
UpdateSourceTrigger | |
ValidationRules | |
NotifyOnSourceUpdated | 获取或设置确定绑定中数据流方向的值。 |
NotifyOnTargetUpdated | 获取或设置一个值,该值指示在将值从源传输到目标时是否引发源 Update 事件。 |
问题10:什么是触发器,WPF中有多少种触发器?
答: 触发器通常用于样式或控件模板中。它触发任何被模板化的属性,并设置控件(或特定模板元素)的其他属性。例如,您将在 IsMouseOver 上使用 Trigger来响应鼠标悬停在控件上,并且 setter 可能会更新画笔以显示“ 热 ”效果。
为什么要使用触发器
触发器在样式中用于对任何属性值的更改或事件触发执行操作。触发器在控件上创建视觉效果。通过使用触发器,我们可以改变框架元素的外观。
WPF 支持五种类型的触发器;他们是:
- Property Trigger
- Data Trigger
- MultiTrigger
- MultiDataTrigger
- Event Trigger
示例 1: 例如,假设您有一个矩形控件。您想在鼠标悬停在矩形控件上时更改该控件的背景颜色,并在鼠标离开时恢复。为此,您需要在后端类中编写矩形控件的鼠标悬停事件和鼠标离开事件,以更改矩形的颜色,如下面的代码所示。
private void Rectangle_MouseMove_1(object sender, MouseEventArgs e)
this.rctback.Fill = Brushes.Red;
private void Rectangle_MouseLeave(object sender, MouseEventArgs e)
this.rctback.Fill = Brushes.Green;
在前面的代码中,您通过在两个不同的事件中编写代码来填充 Rectangle 控件的背景颜色,但是触发器通过减少代码来帮助克服这个问题。
问题 11:WPF 中的 Prism 是什么?
答: Prism(WPF 和 Silverlight 的复合应用程序指南)旨在在 WPF 和 Silverlight 中构建具有单一代码库的应用程序。它有助于以模块化方式开发客户端应用程序,以便将大型应用程序的复杂性划分为更简单的模块。
换句话说,“ Prism 由 Microsoft Patterns and Practices 开发,提供旨在帮助您更轻松地设计和构建丰富、灵活且易于维护的 Windows Presentation Foundation (WPF) 桌面应用程序的指南。 ”。
架构: 下图显示了基本架构:
- App.XAML: 在 Application_Startup 上调用引导引导程序。
- BootStrapper: 这是一个调用 Shell (Shell.XAML) 并创建模块目录的类文件。
- Shell: 这就像具有区域的母版页。
- Region: 就像是注册视图的占位符。
- View: 这是具有用户界面的 XAML 文件
- Module: 每个模块可以有一个或多个视图,这些视图通过 Region Manager 注册到 Region(在 Shell 中)。
问题 12:XAML 中有哪些绑定模式?
答: DataBinding 模式定义了到源的通信方向或来自源的数据流方向。在 XAML(WPF、Silverlight、WP 或 Win8 应用程序)中有五种方法可以将数据目标对象绑定到源。
- OneWay: 数据只移动一个方向,源属性自动更新目标属性但源不改变。
- TwoWay: 数据在两个方向移动,如果您在源或目标中更改它,它会自动更新到另一个
- OneWayToSource: 数据从目标移动到源更改目标属性以自动更新源属性但目标不更改。
- OneTime: 数据只更改一次,之后不再设置,只有第一次更改源属性会自动更新目标属性,但源不会更改,后续更改不会影响目标属性。
问题 13:MVP、MVC 和 MVVM 有什么区别?
MVP(Model-View-Presenter)
在 MVP 模式中,用户将输入发送到视图,视图将其转发给演示者和演示者,然后根据用户操作的类型修改视图或模型。视图和演示者通过双向关系紧密耦合。该模型不了解演示者。视图本身是被动的,这就是为什么它被称为演示者模式,因为演示者将数据推送到视图中。
MVC(Model-View-Controller)
在这种模式中,只有一个控制器直接获取所有输入,它根据输入的类型修改模型中的数据。模型和视图都是由控制器创建的。视图只知道模型,而模型不知道任何其他对象。
模型视图视图模型(MVVM)是一种用于软件工程的架构模式,起源于微软,它专门研究演示模型设计模式。它基于模型-视图-控制器模式 (MVC),MVVM 是一种利用 WPF 平台的核心功能创建客户端应用程序的方法,允许对应用程序功能进行简单的单元测试,并帮助开发人员和设计人员以更少的资源协同工作技术难点。
问题 14:WPF 中的模板是什么?
答:
模板是 WPF 中用户界面设计不可或缺的一部分。WPF 有以下三种类型的模板:
- Control Template
- Items Panel Template
- Data Template
控制模板
控件的 ControlTemplate 定义控件的外观。我们可以通过简单地更改控件的 ControlTemplate 来更改或定义控件的新外观。当您编写自己的控件时,ControlTemplates 会更加有用。使用 ControlTemplates,您可以构建一个具有圆形布局的自定义按钮,并在您将鼠标悬停或按下它时更改其颜色。
XAML 中的 ControlTemplate 元素在设计时定义了一个 ControlTemplate。模板通常使用 FrameworkElement 的 Resources 属性定义为资源。以下代码片段是为 Button 元素定义 ControlTemplate 的语法。
问题 14:WPF 中的模板是什么?
答: 模板是 WPF 中用户界面设计不可或缺的一部分。WPF 有以下三种类型的模板:
- Control Template
- Items Panel Template
- Data Template
Control Template
控件的 ControlTemplate 定义控件的外观。我们可以通过简单地更改控件的 ControlTemplate 来更改或定义控件的新外观。当您编写自己的控件时,ControlTemplates 会更加有用。使用 ControlTemplates,您可以构建一个具有圆形布局的自定义按钮,并在您将鼠标悬停或按下它时更改其颜色。
XAML 中的 ControlTemplate 元素在设计时定义了一个 ControlTemplate。模板通常使用 FrameworkElement 的 Resources 属性定义为资源。以下代码片段是为 Button 元素定义 ControlTemplate 的语法。
<Grid>
<Grid.Resources>
<ControlTemplate x:Key="RoundButtonTemplate" />
</Grid.Resources>
</Grid>
我们需要创建一个圆形按钮,其中按钮的外圈颜色与内圈颜色不同,当您将鼠标悬停并按下按钮时,它会更改背景颜色。
添加一个网格作为 ControlTemplate 的内容。在具有不同半径和不同颜色填充的 Grid 中添加两个 Ellipse 元素。
<Grid.Resources>
<ControlTemplate x:Key="RoundButtonTemplate">
<Ellipse Width="100" Height="100" Name="ButtonBorder" Fill="
OrangeRed" />
<Ellipse Width="80" Height="80" Fill="
Orange" /> </Grid>
</ControlTemplate>
</Grid.Resources>
以下代码片段创建一个 Button 元素并将其模板设置为我们创建的 ControlTemplate -
<Button Template="{StaticResource RoundButtonTemplate}" >确定</Button>
ItemsPanelTemplate
在前面的示例中,我们看到了如何在资源中使用 Style 元素来对元素的多个属性进行分组,并使用元素的 Style 属性对其进行设置。然而,Style 功能并不止于此。样式不仅可用于对属性进行分组和共享,还可以对任何 FrameworkElement 或 FrameworkContentElement 上的资源和事件处理程序进行分组和共享。
样式是资源,可以作为任何其他资源使用,可以应用于当前元素、父元素、根元素甚至应用程序级别。如果样式与任何其他资源相似,则范围。资源查找过程首先查找本地样式,如果没有找到,则遍历逻辑树中的父元素,依此类推。最后,资源查找过程在应用程序和主题中查找样式。
XAML 中的 Style 元素表示一种样式。Style 元素的典型定义如下所示:
<Style>
Setters
</Style>
从 Style 的定义中可以看出,一个 Style 多了一个 Setter 元素。每个 Setter 由一个属性和一个值组成。属性是属性的名称,值是要应用样式的元素的该属性的实际值。
Setters 属性
Type 的 Setters 属性表示 Setter 和 EventSetter 对象的集合。清单 4 使用 Setters 属性并添加了一个 Setter 和 EventSetter 对象。
代码片段通过在设计时使用 XAML 添加几个 Setter 元素和一个 EventSetter 元素来设置 Style 的 Setters 属性。
<Grid>
<Grid.Resources>
<Style TargetType="{x:Type Button}">
<Setter Property=
"Width" Value="200"/> <Setter Property="Height" Value="30"/> <Setter Property="Foreground" Value="White"/> <Setter Property="Background" Value="DarkGreen"/> <Setter Property="BorderBrush" Value="Black"/> <EventSetter Event="Click" Handler="Button1_Click"/>
</Style>
</Grid.Resources>
<Button>Click me</Button>
</Grid>
问题 15:WPF 中的各种布局面板有哪些?
答: WPF 自带以下五个内置面板:
- Canvas
- DockPanel
- Grid
- StackPanel
- WrapPanel
这些面板的目的和用途是不同的。每个面板都有不同的方式来定位和重新定位放置在该面板中的子控件。本系列的以下文章将总结这些面板及其用法。
与任何其他 WPF 控件类似,Panel 控件可以用两种方式表示。首先,在设计时使用 XAML 元素和属性,其次,在运行时使用 WPF 类及其属性。
代码片段在设计时使用 XAML 创建了一个 Grid 面板。
<Window x:Class="CanvasPanelSample.Window1"
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300"
Name="RootWindow">
<Grid Name="GridPanel" Background="
Blue"
Width="250" Height="200"
VerticalAlignment="Top"
HorizontalAlignment="Left"
FlowDirection="LeftToRight"
</Window>
问题 16:WPF 中的附加属性是什么?
答: 附加属性基本上是允许将值附加到任何随机对象的依赖属性。附加属性 (AP) 又是 XAML 中的一种依赖属性 (DP)。它们可用于接收自身更改的通知,因为它们是一种依赖属性,但这些属性的区别之一是它们没有在它们使用的同一类中定义,这与 DP 不同。
-
定义附加属性的类型被设计为可以成为将为附加属性设置值的元素的父元素。然后该类型使用内部逻辑针对某个对象的树结构迭代其子对象,获取值并以某种方式对这些值进行操作。
-
定义附加属性的类型将用作各种可能的父元素和内容模型的子元素。
- 定义附加属性的类型表示服务。其他类型设置附加属性的值。然后,当在服务上下文中评估设置属性的元素时,使用服务类的内部逻辑获取附加属性值。
AP 被称为“ 附加 ”属性,因为我们可以将一些原本不期望从该控件获得的行为附加到该控件。
例子
假设我有一个 TextBox 控件,我想扩展它的功能以接受字母和特殊符号,但不接受数值。
我在我的类 TextBlockExtension.cs 中定义的 AP 如下所示:
public static bool GetAllowOnlyString(DependencyObject obj)
return (bool) obj.GetValue(AllowOnlyStringProperty);
public static void SetAllowOnlyString(DependencyObject obj, bool value)
obj.SetValue(AllowOnlyStringProperty, value);
// Using a DependencyProperty as the backing store for AllowOnlyString. This enables animation, styling, binding, etc...
public static readonly DependencyProperty AllowOnlyStringProperty = DependencyProperty.RegisterAttached("AllowOnlyString", typeof (bool), typeof (TextblockExtension), new PropertyMetadata(false, AllowOnlyString));
private static void AllowOnlyString(DependencyObject d, DependencyPropertyChangedEventArgs e)
if (d is TextBox)
TextBox txtObj = (TextBox) d;
txtObj.TextChanged += (s, arg) =>
TextBox txt = s as TextBox;
if (!Regex.IsMatch(txt.Text, "^[a-zA-Z]*$"))
txtObj.BorderBrush = Brushes.Red;
MessageBox.Show("Only letter allowed!");
如我们所见,在代码中,AP 的默认值为 False,换句话说,我们需要为 AP 提供值 true,只要我希望此功能适用于 TextBox。
在我的 MainWindow.xaml.cs 中,我定义了我的 TextBox,如下所示:
<TextBox Width="200" Height="50" local:TextblockExtension.AllowOnlyString="True"></TextBox>
问题 17:WPF 中的资源是什么?WPF中有多少种资源?
答: Windows Presentation Foundation (WPF) 资源提供了一种简单的方法来重用常用定义的对象和值。WPF 中的资源允许您一次设置多个控件的属性。例如,您可以使用单个资源在 WPF 应用程序中的多个元素上设置背景属性。
定义资源的最佳方式是在 Window 或 Page 元素级别。您为元素定义的任何资源也适用于该元素的子元素。
如果为网格元素定义资源,则该资源仅适用于网格元素的子元素。
WPF 中资源的语法如下:
<elementName propertyName="{markupExtension keyName}">
<!-内容 -->
</元素名>
有两种类型的资源,即,
- Static Resource
- Dynamic Resource
静态资源
我们应该使用 StaticResource 标记扩展来将资源定义为静态资源。StaticResource 的值在加载时确定。
<Grid.Resources>
<SolidColorBrush x:Key="lblbgcolor" Color="Blue"/>
</Grid.Resources>
<Label Name="lbl" Margin="71,44,77,0" Background="{StaticResourcelblbgcolor}" Height="49" />
动态资源
我们在想要在运行时更改属性值的情况下使用动态资源。
<Window.Resources>
<SolidColorBrush x:Key="brush" Color="Red" />
</Window.Resources>
<Button x:Name="btn" Content="Click Me" Click="Button_Click" Background="{DynamicResource brush}" Height="100" Width="100" />
打开 Code behind 并添加以下代码片段:
private void Button_Click(object sender, RoutedEventArgs e)
this.btn.SetResourceReference(BackgroundProperty, "brush");
问题18:静态资源和动态资源有什么区别?
回答
最基本的区别是 StaticResource只评估一次资源,而 DynamicResource 每次需要资源时都会评估它。由于这个原因,DynaamicResource在系统上很重,但它使页面或窗口加载速度更快。
StaticResource
在应用程序实际运行之前加载 XAML 期间,将解析静态资源并将其分配给属性。它只会被分配一次,对资源字典的任何更改都会被忽略。
静态资源引用最适合以下情况:
-
您的应用程序设计将其大部分资源集中到页面或应用程序级资源字典中。静态资源引用不会根据运行时行为(例如重新加载页面)重新评估,因此当您的资源和应用程序设计不需要大量动态资源引用时,避免这些资源引用可能会带来一些性能优势。
-
您正在设置不在依赖对象或可冻结的属性的值。
- 您正在创建一个资源字典,该字典将被编译为 DLL,并作为应用程序的一部分打包或在应用程序之间共享。
DynaamicResource
动态资源在加载期间将一个 Expression 对象分配给该属性,但直到运行时要求该 Expression 对象提供值时才实际查找该资源。这会延迟查找资源,直到在运行时需要它。
动态资源最适合以下情况:
-
资源的价值取决于直到运行时才知道的条件。这包括系统资源或用户可设置的资源。例如,您可以创建引用系统属性的设置器值,这些属性由系统颜色、系统字体或系统参数公开。这些值是真正动态的,因为它们最终来自用户和操作系统的运行时环境。您可能还具有可以更改的应用程序级主题,其中页面级资源访问也必须捕获更改。
-
您正在为自定义控件创建或引用主题样式。
- 您打算在应用程序生命周期内调整资源字典的内容。
例子
<Window.Resources>
<SolidColorBrush x:Key="brush" Color="Green" />
<Style TargetType="Border" x:Key="PageBackground">
<Setter Property="Background" Value="Gold"/>
</Style>
</Window.Resources>
<Border Style="{DynamicResource PageBackground}">
<Button x:Name="btn" Content="Rajkumar Test" Click="Button_Click" Background="{DynamicResource brush}" Height="30" Margin="53,130,85,130" /> </Border>
</Grid>
您可以像下面这样申请代码
private
void Button_Click(object sender, RoutedEventArgs e)
this.btn.SetResourceReference(BackgroundProperty, "brush");
问题 19:什么是 WPF 依赖属性,我们如何使用?
答: WPF 为 CLR 属性提供了一些扩展服务,我们统称为依赖属性。依赖属性是一种属性,其值取决于外部源,例如动画、数据绑定、样式或可视树继承。不仅如此,依赖属性还具有在属性更改时提供通知、数据绑定和样式的内置功能。
依赖属性的优点:
- 更少的内存消耗
- 属性值继承
- 更改通知和数据绑定
- 参与动画、样式和模板
- 回调
- 资源
- 覆盖元数据
代码
public class CarDependencyProperty: DependencyObject
//Register Dependency Property
public static readonly DependencyProperty CarDependency = DependencyProperty.Register("MyProperty", typeof (string), typeof (DependencyPropertySample));
public string MyCar
return (string) GetValue(CarDependency);
SetValue(CarDependency, value);
public partial class CarDependencyPropertyDemo: Window
public CarDependencyPropertyDemo()
InitializeComponent();
private void MyButton_Click(object sender, RoutedEventArgs e)
CarDependency dpSample = TryFindResource("CarDependency ") as CarDependency;
MessageBox.Show(dpSample.MyCar);
问题20:什么是附加属性,如何注册?
答: 附加属性 (AP) 可用于接收自身更改的通知,因为它们是依赖属性的一种类型,但这些属性的区别之一是它们没有在它们使用的同一类中定义,不像DP。WPF 开发人员通常存在的一种误解是,这些属性只能在父控件中定义,也就是我们要在其中使用它们的控件。
AP 可以在以下三种情况之一中定义:
-
定义附加属性的类型被设计为可以成为将为附加属性设置值的元素的父元素。然后该类型使用内部逻辑针对某个对象的树结构迭代其子对象,获取值并以某种方式对这些值进行操作。
-
定义附加属性的类型将用作各种可能的父元素和内容模型的子元素。
- 定义附加属性的类型表示服务。其他类型设置附加属性的值。然后,当在服务上下文中评估设置属性的元素时,使用服务类的内部逻辑获取附加属性值。
例子
public static bool GetAllowOnlyString(DependencyObject obj)
return (bool) obj.GetValue(AllowOnlyStringProperty);
public static void SetAllowOnlyString(DependencyObject obj, bool value)
obj.SetValue(AllowOnlyStringProperty, value);
// Using a DependencyProperty as the backing store for AllowOnlyString. This enables animation, styling, binding, etc...
public static readonly DependencyProperty AllowOnlyStringProperty = DependencyProperty.RegisterAttached("AllowOnlyString", typeof (bool), typeof (TextblockExtension), new PropertyMetadata(false, AllowOnlyString));
private static void AllowOnlyString(DependencyObject d, DependencyPropertyChangedEventArgs e)
if (d is TextBox)
TextBox txtObj = (TextBox) d;
txtObj.TextChanged += (s, arg) =>
TextBox txt = s as TextBox;
if (!Regex.IsMatch(txt.Text, "^[a-zA-Z]*$"))
txtObj.BorderBrush = Brushes.Red;
MessageBox.Show("Only letter allowed!");
如我们所见,在代码中,AP 的默认值为 False,换句话说,我们需要为 AP 提供值 true,只要我希望此功能适用于 TextBox。
在我的 MainWindow.xaml.cs 中,我定义了我的 TextBox,如下所示:
<TextBox Width="200" Height="50" local:TextblockExtension.AllowOnlyString="True"></TextBox>
问题 21:什么是路由事件?
答:路由事件是关于您在事件中使用的控件的层次结构。路由事件是 WPF 提供的一种新的基础结构,它允许事件沿着树向下传送到目标元素或冒泡到根元素。路由事件就像正常事件一样。
路由事件的类型
路由事件分为三种类型,如下所示:
- 冒泡事件
- 隧道事件
- 直接事件
隧道事件: 隧道事件与冒泡事件相反。在控件层次结构中首先引发的隧道事件。这些事件由 Root 元素引发。这允许事件沿着树向下传送。
冒泡事件: 冒泡事件是由控件首先引发的事件,而不是由控件层次结构中的其他控件引发的事件。它允许冒泡到树直到根元素。首先引发隧道事件,然后引发冒泡事件。
直接事件: 直接事件通常由控件本身引发。此事件的行为与 .NET 常规事件相同。
问题 22:WPF 中的旋转变换是什么?
答案: RotateTransform 将元素绕该点顺时针旋转指定角度。WPF 中的 RotateTransform 对象表示 RotateTransform。Angle 属性表示顺时针旋转的角度(以度为单位)。CenterX 和 CenterY 属性表示中心点的 X 和 Y 坐标。默认情况下,ScaleTransform 以点 (0,0) 为中心,该点对应于矩形的左上角。
创建两个具有相同位置和大小的矩形,接受第二个矩形旋转 45 度。
<Grid>
<!-- Original Rectangle -->
<Rectangle Width="200" Height="50" Fill="Yellow" />
<!-- Rectangle with 45 degrees rotation -->
<Rectangle Width="200" Height="50" Fill="Blue" Opacity="0.5">
<Rectangle.RenderTransform>
<RotateTransform CenterX="0" CenterY="0" Angle="45" /> </Rectangle.RenderTransform>
</Rectangle>
</Grid>
以下代码片段更改了 CenterX 和 CenterY 的值。
<Rectangle Width="200" Height="50" Fill="Blue" Opacity="0.5" Margin="61,27,117,184">
<Rectangle.RenderTransform>
<RotateTransform CenterX="-50" CenterY="50" Angle="45" />
</Rectangle.RenderTransform>
</Rectangle>
问题23:WPF中的控件模板是什么?
答: ControlTemplate 包含定义所需外观的元素树。定义 ControlTemplate 后,您可以通过将其设置为 TemplateProperty 将其附加到任何控件或页面。
<Grid>
<Grid.Resources>
<ControlTemplate x:Key="buttonTemplate">
<Ellipse Width="160" Height="160" x:Name="outerCircle">
<Ellipse.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0" Color="Green"></GradientStop>
<GradientStop
Offset="1" Color="Purple"></GradientStop>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
<Ellipse Width="120" Height="120">
<Ellipse.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0" Color="Gray"> </GradientStop>
<GradientStop Offset="1" Color="Blue"> </GradientStop>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="Button.IsMouseOver" Value="True">
<Setter TargetName="outerCircle" Property="Fill" Value="Black"> </Setter>
</Trigger>
<Trigger Property="Button.IsPressed" Value="True">
<Setter Property="RenderTransform">
<Setter.Value>
<ScaleTransform ScaleX=".8" ScaleY=".8"> </ScaleTransform>
</Setter.Value>
</Setter>
<Setter Property="RenderTransformOrigin" Value=".6,.6"> </Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Grid.Resources>
<Button Template="{StaticResource buttonTemplate}">Click Me</Button>
</Grid>
鼠标悬停后:
问题 24:我们如何在 WPF 中创建无边框窗口?
答: 我们可以通过两种方式创建无边框窗口。
首先,通过在 <Window> 元素中编写 WindowStyle 属性 = None、SingleBorderWindow 、 ThreeDBorderWindow 或 ToolWindow 。
<Window x:Class="WpfApp1.MainWindow" xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525" WindowStyle="None">
<Grid> </Grid>
</Window>
第二种方法是打开属性窗口,选择窗口样式属性为 None、SingleBorderWindow、ThreeDBorderWindow 或 ToolWindow。
问题 25:WPF 中的 XAML 是什么,还解释了 XAML 的类型?
答: 可扩展应用程序标记语言,发音为“zammel”,是一种用于实例化 .NET 对象的标记语言。虽然 XAML 是一种可以应用于许多不同问题领域的技术,但它在生活中的主要作用是构建 WPF 用户界面。
重要任务 XAML 执行如下,
连接事件处理程序: 在大多数情况下附加事件处理程序,例如单击按钮在 Visual Studio 中很容易做到。然而,一旦我们了解了事件在 XAML 中是如何连接的,我们将能够创建更复杂的连接。
- 定义资源: 资源是我们在 XAML 中定义的对象,可以在标记内的各个地方重用。资源使我们能够集中和标准化格式,并创建非可视对象,例如模板和动画。
- 定义控件模板: WPF 控件被设计为无外观的,这意味着我们可以用我们的自定义视觉效果代替标准外观。为此,我们必须创建自己的控件模板,它只不过是一个 XAML 标记块。
XAML 的类型
- WPF XAML: 包含描述 WPF 内容的元素,例如矢量图形、控件和文档。
- XPS XAML: 它是 WPF XAML 的一部分,用于定义格式化电子文档的 XML 表示。
- Silverlight XAML: 用于 Silverlight 应用程序的 WPF XAML 子集。Silverlight 是一个跨平台的浏览器插件,它允许我们创建丰富的 Web 内容。
- WF XAML: 包含描述 Windows Workflow Foundation 的元素。
问题 26:如何设置 NavigationWindow 的内容?
答:Navigation Window 类是从Window 类派生而来的,所以它继承了Windows 的所有属性,如方法、属性和事件。导航窗口提供后退和前进按钮,用于导航到我们之前访问过或尚未访问过的页面。
创建导航分页应用程序: 要创建基于导航窗口的应用程序,请使用导航窗口容器而不是窗口容器,如下图所示,源是导航窗口的属性并写下要设置的页面名称作为主页如下图所示:
问题27:什么是WPF子窗口?
答:ChildWindow 控件是一个轻量级的窗口,可以用作子窗口或弹出控件。当子窗口处于活动状态和模式时,父窗口会自动禁用。您可以将 ChildWindow 视为自定义模式或非模式对话框,您可以在其中放置所需的任何子控件。但是,ChildWindow 有几个常见的 Window 属性。
创建一个子窗口:
ChildWindow 元素表示 XAML 中的 WPF ChildWindow 控件。ChildWindow 控件在 System.Windows.Controls 命名空间中定义。
使用其 Width、Height、Name、IsModal 和 Caption 属性创建一个简单的 ChildWindow 控件。
<wpfx:ChildWindow Name="PopupChildWindow" Caption="Child Window" Width="300" Height="200"IsModal="True" />
我们需要调用 Show() 方法来使子窗口可见。
- PopupChildWindow.Show();
问题 28:什么是 WPF 内容控件?
答:内容控件主要是存放内容的父容器。它向用户显示要查看的信息,但通常不会被修改。
有了内容控件,有以下几个方面:
-
属性:
属性指定对象的外观或行为。例如,IsEnabled 属性指定用户是否可以与控件交互。
-
方法:
方法是控件执行以执行某些操作的例程。例如 Coa unt Method 计算对象或控件可用的项目数。
- 事件: 当控件引发一个事件以让您的应用程序知道发生了某些事情时,该事件是相关的。例如,只要 TextBox 的文本发生更改,它就会引发一个 TextChanged 事件。
代码片段
<Button Name="btnAdd" Content="Add" Click="btnAdd_Click" />
问题29:WPF中的Tab Control是什么?
答:Tab 控件是一种常见的 UI 元素,已经存在了一段时间。它是一种方便的方式来组织你的窗口,当有更多的东西不能实际适合并且仍然可以理解时。选项卡控制在 Windows Presentation Foundation 中更容易。
两个元素在构建选项卡控件中起主要作用:
- TabControl
- TabItem
TabControl 是一个或多个 TabItem 元素的容器,如下所示。
<TabControl>
<TabItem Header="Tab 1">xyz</TabItem>
<TabItem Header="Tab 2">abc</TabItem>
</TabControl>
在 WPF 中,Tabs 很容易实现。创建一个新的 WPF 窗口,删除默认的 Grid 标记,并添加以下 XAML:
<TabControl>
<TabItem Header="Tab 1">xyz</TabItem>
<TabItem Header="Tab 2">abc</TabItem>
</TabControl>
问题 30:如何剪辑或裁剪图像?
答:裁剪区域是通过设置区域的轮廓来显示区域的部分区域的过程。在 WPF 中,剪辑已扩展到从 UIElement 继承的所有元素,包括控件、图像、面板、窗口和页面。
<Window.Clip>
<EllipseGeometry Center="150,160" RadiusX="120" RadiusY="120" />
</Window.Clip>
以下代码片段将图像剪辑或裁剪为椭圆。
<Image Source="Garden.jpg">
<Image.Clip>
<EllipseGeometry Center="150,160" RadiusX="120" RadiusY="120" />
</Image.Clip>
</Image>
private void ClipImage()
// Create a BitmapImage
BitmapImage bmpImage = new BitmapImage
();
bmpImage.BeginInit();
bmpImage.UriSource = new Uri(@ "C:\Images\Garden.jpg", UriKind.RelativeOrAbsolute);
bmpImage.EndInit();
// Clipped Image
Image clippedImage = new Image();
clippedImage.Source = bmpImage;
EllipseGeometry clipGeometry = new EllipseGeometry(new Point(150, 160), 120, 120);
clippedImage.Clip = clipGeometry;
LayoutRoot.Children.Add(clippedImage);
问题 31:WPF 中的转换器是什么?
答:转换器提供了实质性的优势,因为它们允许在源对象和目标对象之间插入对象。在高层次上,转换器是使用绑定连接的一大块自定义代码,数据将通过该转换器流动。因此,每当数据从源流向目标时,都可以更改值或更改需要在目标属性上设置的对象类型。
因此,每当数据从源传输到目标时,都可以通过两种方式进行转换:
-
Data value:
这里的转换将通过保持数据类型不变而仅使用值完成。例如,对于数字字段,您可以通过将实际值保持为浮点数来将值从浮点数转换为整数。
- Data type: 也可以转换数据类型。例如,根据一些布尔标志设置样式。
定义转换器
-
Convert:
当数据从源流向目标时调用。
- ConvertBack: 当数据从目标流向源时调用。它基本上在双向绑定场景中很有用。
如何使用
一旦您的类成为 ResourceDictionary 的一部分,您就可以使用 Binding 的 Converter 属性以及 StaticResource 标记扩展来指向转换器的实例。
转换器的放置位置
要实现 IValueConverter,必须创建一个类,然后将该类的实例放在 UI 中的 ResourceDictionary 中。
问题 32:“UpdateSourceTrigger”如何影响绑定?
答:这是绑定上的一个属性,它控制从目标到源的数据流,用于双向数据绑定。默认模式是焦点发生变化但有许多其他选项可用时。
UpdateSourceTrigger 可用的属性
- Default: 这是默认值,这意味着大多数控件失去焦点。
- LostFocus: 值更新将暂停,直到焦点移出控制。
- PropertyChanged: 只要目标属性发生变化,就会发生值更新。它通常发生在每个按键上。
- Explicit: 用于延迟源更新,直到用户通过单击按钮左右强制执行更新。
Default vs LostFocus
Default 和 LostFocus 对于除 DataGrid 之外的大多数控件来说意味着相同的东西。对于数据网格:
- LostFocus:细胞失去焦点
- Default : 行失去焦点
<grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50*" />
<ColumnDefinition Width="50*" />
</Grid.ColumnDefinitions>
<TextBlock Text="Source:" Width="auto" />
<TextBox Name="SourceText" Width="160" Height="30" Margin="48,0,44,82" />
<TextBlock Text="Target:" Grid.Column="1" Width="auto" />
<TextBox Name="TargetText" Width="160" Height="30" Text="{Binding ElementName=SourceText, Path=Text,UpdateSourceTrigger=Default}" Grid.Column="1" Margin="44,0,47,82" />
</grid>
输出
当用户输入源文本框时:
问题 33:WPF 中有哪些对齐方式?
答:FrameworkElement 有两个对齐属性:HorizontalAlignment 和 Vertical Alignment。Horizontal Alignment 属性是一种 HorizontalAlignment 枚举类型,表示子元素在父元素中的水平定位方式。
HorizontalAlignment 枚举具有 Left、Center、Right 和 Stretch 四个属性。Left、Center 和 Right 属性将子元素设置为父元素的左、中和右。Stretch 属性拉伸子元素以填充父元素分配的布局空间。
例子
<StackPanel Background="LightGray">
<Button Name="Rect1" Background="LightBlue" Width="150" Height="50" HorizontalAlignment="Left" Content="Left Aligned" />
<Button Name="Rect2" Background="LightGreen" Width="150" Height="50" HorizontalAlignment="Center" Content="Center Aligned" />
<Button Name="Rect3" Background="LightCyan" Width="150" Height="50" HorizontalAlignment="Right" Content="Right Aligned" />
<Button Name="Rect4" Background="LightPink" Height="50" HorizontalAlignment="Stretch" Content="Stretch Aligned" />
</StackPanel>
VerticalAlignment 属性是一种 HorizontalAlignment 枚举类型,表示子元素在父元素中的垂直定位方式。
VerticalAlignment 枚举具有四个属性 Top、Center、Bottom 和 Stretch 。Top、Center 和 Bottom 属性将子元素设置为父元素的顶部、中心或底部。Stretch 属性拉伸子元素以垂直填充父元素分配的布局空间。
例子
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>
<Button Name="Button1" Background="LightBlue" Height="30" Width="100" VerticalAlignment="Top" Content="Left Aligned" />
<Button Name="Button2" Background="LightGreen" Height="30" Width="100" Grid.Column="1" VerticalAlignment="Center" Content="Center Aligned" />
<Button Name="Button3" Background="LightCyan" VerticalAlignment="Bottom" Height="30" Width="100" Grid.Column="2" HorizontalAlignment="Left" Content="Right Aligned" />
<Button Name="Button4" Background="LightPink" Content="Stretch ligned" Width="100" Grid.Column="3" HorizontalAlignment="Stretch" />
</Grid>
问题 34:什么是 ToolTip,我们如何在 WPF 中使用它?
答:当鼠标悬停在某个控件上时,ToolTip 控件会在浮动框中显示有关该控件的一些信息或提示,而当鼠标离开该控件时它会消失。
工具提示用于帮助用户了解控件在许多基于 Windows 的程序中的用途。工具提示只不过是当用户将鼠标指针悬停在控件上时出现的小矩形。矩形包含一小段描述控件的文本。显示后,当用户将鼠标指针从链接控件上移开或单击鼠标按钮时,或者经过短暂的延迟后,提示就会消失。
工具提示示例: 从工具箱中拖动一个 Button 控件并将其放下。将 ToolTip 属性添加到按钮,其中包含要在鼠标悬停按钮时显示的消息。我们可以通过两种方式添加 ToolTip。首先,该按钮显示了显示工具提示的最简单方式。第二种方法是创建自定义工具提示的首选方法。
<Button Content="Click Here" Margin="30" FontSize="16" ToolTip="Click Here"></Button>
<Button Content="Click Here" Margin="30" FontSize="16">
<Button.ToolTip>
<ToolTip> Click Here </ToolTip>
</Button.ToolTip>
</Button>
问题35:如何让ListBox平滑滚动?
回答:ListBox 控件是一个项目控件,它作为一个 ListBox 控件工作,但一次只能看到集合中的一个项目,单击 ListBox 会使集合可见,并允许用户从集合中选择一个项目。与 ListBox 控件不同,ListBox 没有多项选择。
ListBox 元素表示 XAML 中的 ListBox 控件。
<ListBox></ListBox>
Width 和 Height 属性表示 ListBox 的宽度和高度。x:Name 属性表示控件的名称,它是控件的唯一标识符。Margin 属性设置 ListBox 在父控件上的位置。HorizontalAlignment 和 VerticalAlignment 属性用于设置水平和垂直对齐方式。
代码设置 ListBox 的垂直和水平对齐方式并设置边距。
<ListBox x:Name="ListBox1" Width="200" Height="200"
VerticalAlignment="Top" HorizontalAlignment="Left"
Margin="10,10,0,0">
</ListBox>
问题36:什么是Popup窗口,如何打开和关闭popup窗口?
回答:Popup窗口是浮动在页面或窗口上的窗口,提供一些快速操作的功能。例如,页面或窗口上的登录控件或控件的动画弹出提示。
XAML 的 Popup 元素表示 WPF Popup 控件。
<Popup></Popup>
Width 和 Height 属性表示 Popup 的宽度和高度。Name 属性表示控件的名称,它是控件的唯一标识符。Margin 属性用于设置 Popup 在父控件上的位置。HorizontalAlignment 和 VerticalAlignment 属性用于设置水平和垂直对齐方式。
以下代码片段设置 Popup 控件的名称、高度和宽度。该代码还将水平对齐设置为左对齐,垂直对齐设置为顶部。
<Popup Margin="10,10,0,13" Name="Popup1" HorizontalAlignment="Left"
VerticalAlignment="Top" Width="194" Height="200" />
打开弹出窗口: 当 IsOpen 设置为 true 时,弹出窗口控件显示其内容。
private void Popup_Ok_Click(object sender, RoutedEventArgs e)Text only
Popup1.IsOpen = true;
其中 popup1 是弹出控件的名称。
关闭弹出 窗口:当 IsOpen 设置为 false 时,弹出窗口控件显示其内容。
private void Popup_Ok_Click(object sender, RoutedEventArgs e)
Popup1.IsOpen = false;
问题 37:WCF 中的装饰器类是什么?
答:装饰器类是 WPF 布局控件的简单基类。装饰器有一个单独的子控件,它们应用一个子控件。
为按钮添加点击事件。将 Button 的 XAML 替换为以下内容:
<Border Name="MyBorder" BorderBrush="Black" BorderThickness="4" CornerRadius="10">
<Button Click="Button_Click">Hello, world!</Button>
</Border>
当程序执行时,出现类似于下图的窗口:
问题38:WPF的优缺点是什么?
好处
-
紧密的多媒体集成:
要在 Windows 32 或 Windows 窗体应用程序中使用 3-D 图形、视频、语音和丰富的文档查看,您需要学习几种独立的技术并将它们混合在一起,而无需太多内置支持。WPF 应用程序允许您通过一致的编程模型使用所有这些功能。
-
分辨率无关性:
WPF 允许您缩小或放大屏幕上的元素,而与屏幕的分辨率无关。它使用矢量图形使您的应用程序与分辨率无关。
-
硬件加速:
WPF 建立在 Direct3D 之上,它将工作卸载到图形处理单元 (GPU) 而不是中央处理器单元 (CPU)。这为 WPF 应用程序提供了硬件加速的好处,允许更流畅的图形和增强的性能。
-
声明式编程:
WPF 使用可扩展应用程序标记语言 (XAML) 声明式编程来定义应用程序对象的布局并表示 3-D 模型等。这允许图形设计师直接为 WPF 应用程序的外观做出贡献。
-
丰富的组合和自定义:
WPF 控件易于自定义。您无需编写任何代码即可以非常独特的方式自定义控件。WPF 还允许您为外观完全不同的应用程序创建皮肤。
-
轻松部署:
WPF 提供了用于部署传统 Windows 应用程序的选项(使用 Windows Installer 或单击一次)。此功能并非 WPF 独有,但仍是该技术的重要组成部分。
- 文化感知控件:控件 中的静态文本和 String 函数的返回数据根据最终用户操作系统指定的文化和语言进行修改。
缺点
-
WPF 的内置控件套件远比 WinForms 受限。
-
对 WinForms 的 3rd-party 控制空间有更大的支持。(这种情况正在发生变化,但现在由于时间的推移,WinForms 在社区中得到了更大的支持)。
-
大多数开发人员已经知道 WinForms;WPF 提供了一个新的学习曲线。
-
WPF 不能在 Windows 2000 或更低版本上运行。
- 没有 MDI 子模式。
问题 39:什么是 WPF 程序集和命名空间?
WPF 程序集 | 生命中的意义 |
WindowsBase.dll | 定义 WPF 的基础结构,包括依赖属性支持。虽然此程序集包含 WPF 框架中使用的类型,但这些类型中的大多数都可以在其他 .NET 应用程序中使用。 |
PresentationCore.dll | 该程序集定义了构成 WPF GUI 层基础的多种类型。 |
PresentationFoundation.dll | 这个程序集——三者中“最丰富的”——定义了 WPF 控件类型、动画和多媒体支持、数据绑定支持以及其他 WPF 服务。出于所有实际目的,这是您将花费大部分时间直接使用的程序集。 |
尽管这些程序集在众多命名空间中提供了数百种类型,但请考虑以下 WPF 命名空间的部分列表:
- 在本课程的剩余部分中,您将遇到其他命名空间。
- 同样,请参阅 .NET Framework SDK 文档以获取完整详细信息。
WPF 命名空间 | 生命中的意义 |
System.Windows | 在这里,您将找到任何 WPF 桌面项目所需的核心类型,例如 Application 和 Window。 |
System.Windows.Controls | 在这里,您将找到所有预期的 WPF 小部件,包括用于构建菜单系统的类型、工具提示和众多布局管理器。 |
System.Windows.Markup | 此命名空间定义了许多类型,这些类型允许解析 XAML 标记和等效的二进制格式 BAML。 |
System.Windows.Media | 在这些命名空间中,您将找到与动画、3D 渲染、文本渲染和其他多媒体原语一起使用的类型。 |
System.Windows.Navigation | 此命名空间提供类型来说明 XAML 浏览器应用程序/桌面导航应用程序使用的导航逻辑。 |
System.Windows.Shapes | 此命名空间定义了 WPF 框架的各个方面使用的基本几何形状(矩形、多边形等)。 |
问题40:WPF和Silverlight有什么区别?
答:Silverlight 和 Windows Presentation Foundation (WPF) 是 Microsoft 的 2 个不同产品,但有很多重叠之处。Silverlight 在特性和功能方面是 WPF 的子集。Silverlight 当然被称为 WPF/E,其中 E 表示无处不在。两者都使用 XAML,一种 XML 形式来定义控件,但 WPF 纯粹用于 Windows,而 Silverlight 在 Windows 和 Mac 上的浏览器中运行。因此,以下是 WPF 和 Silverlight 之间的区别:
- Silverlight 旨在在线使用,而 WPF 用于本地使用。
- Silverlight 无法访问本地资源,而 WPF 可以利用本地资源。
- Silverlight 仅支持透视 3D,而 WPF 支持完整的 3D 图像。
- Silverlight 不支持 WPF 的一些更高级的概念,例如控件和模板。
- Silverlight 直接集成到 HTML 页面中,而 WPF XAML 文件如果想要与 HTML 内容混合,则必须通过框架加载。
问题41:什么是WPF accesstext Control?
答:WPF 中的 AccessText 控件将下划线开头的字符转换为访问键。访问键已注册,因此在按下时会引发事件。
创建 AccessText
AccessText 元素表示 XAML 中的 AccessText 控件。
<AccessText>_点击我</AccessText>
以下代码片段将 AccessText 添加到 Button 控件。当您选择键盘上的 ALT+C 键时,将引发按钮控件单击事件。
<Button Name="Button1" Width="120" Height="50" Margin="33,70,59,124" FontSize="16" Click="Button1_Click">
<AccessText>_Click Me</AccessText>
</Button>
如果有多个下划线字符,则只转换第一个为AccessKey;其他下划线显示为普通文本。如果要转换为访问密钥的下划线不是第一个下划线,请对要转换的下划线之前的任何下划线使用两个连续的下划线。
问题 42:WPF 提供了哪些不同类型的画笔?
答:画笔和钢笔是用于绘制和填充图形对象的对象。WPF 和 XAML 一起工作,每个 XAML 控件都有一个 WPF 类。例如,XAML 中的 <SolidColorBrush> 标记和 WPF 中的 SolidColorBrush 类都表示纯色画笔。您可以分别以两种方式创建和使用画笔,也可以混合使用。
在 XAML 和 WPF 模型中提供了以下画笔对象:
- SolidColorBrush
- LinearGradientBrush
- RadialGradientBrush
- DrawingBrush
- Visual Brush
- ImageBrush
问题43:WPF中有多少种位图效果?
答:位图效果是简单的像素处理操作。位图效果将 BitmapSource 作为输入,并在应用效果后生成新的 BitmapSource。
位图效果使设计人员和开发人员能够将视觉效果应用于呈现的 Microsoft Windows Presentation Foundation (WPF) 内容。例如,位图效果允许您轻松地将 DropShadowBitmapEffect 效果或模糊效果应用于图像或按钮。非托管 API 为独立硬件供应商 (IHV) 提供了一个可扩展的框架,以开发自定义效果以在 WPF 应用程序中使用。
以下是 WPF 中可用的位图效果:
- BlurBitmapEffect
- OuterGlowBitmapEffect
- DropShadowBitmapEffect
- BevelBitmapEffect
- EmbossBitmapEffect
每个位图效果都有可以控制过滤属性的属性,例如 BlurBitmapEffect 的 Radius。
问题 44:什么是 WPF 中的树视图?我们如何删除 WPF 中的树视图?
答:TreeView 表示父子关系中的分层视图中的数据,其中父节点可以展开或折叠。Windows 资源管理器的左侧栏是 TreeView 的示例。
TreeView 标记表示 XAML 中的 WPF TreeView 控件。
<TreeView></TreeView>
添加 TreeView 项
TreeView 控件承载 TreeViewItem 的集合。Header 属性是显示在视图上的项目的文本。下面的代码片段将一个父项和六个子项添加到 TreeView 控件。
<TreeView Margin="10,10,0,13" Name="TreeView1" HorizontalAlignment="Left" VerticalAlignment="Top" Width="194" Height="200">
<TreeViewItem Header="Cold Drinks">
<TreeViewItem Header="Coke"></TreeViewItem>
<TreeViewItem Header="Pepsi"></TreeViewItem>
<TreeViewItem Header="Orange Juice"></TreeViewItem>
<TreeViewItem Header="Milk"></TreeViewItem>
<TreeViewItem Header="Iced Tea"></TreeViewItem>
<TreeViewItem Header="Mango Shake"></TreeViewItem>
</TreeViewItem>
</TreeView>
删除 TreeView 项目
我们可以使用 TreeView.Items.Remove 或 TreeView.Items.RemoveAt 方法从 TreeView 中的项目集合中删除一个项目。RemoveAt 方法获取集合中项目的索引。
<Button Height="23" Margin="226,14,124,0" Name="DeleteButton"
VerticalAlignment="Top" Click="DeleteButton_Click">
Delete Item</Button>
代码从 TreeView 中删除根项,而不是子项。要删除子项,首先我们需要找到选中的项,然后我们需要调用 TreeViewItem.Items.RemoveAt 方法。
private void DeleteButton_Click(object sender, RoutedEventArgs e)
TreeView1.Items.RemoveAt
(TreeView1.Items.IndexOf(TreeView1.SelectedItem));
问题 45:WPF 中有哪些命令?
答:命令有几个目的。第一个目的是将语义和调用命令的对象与执行命令的逻辑分开。这允许多个不同的源调用相同的命令逻辑,并且允许为不同的目标定制命令逻辑。例如,在许多应用程序中发现的编辑操作复制、剪切和粘贴,如果它们是通过使用命令来实现的,则可以通过使用不同的用户操作来调用。应用程序可能允许用户通过单击按钮、选择菜单中的项目或使用组合键(如 CTRL+X)来剪切选定的对象或文本。通过使用命令,您可以将每种类型的用户操作绑定到相同的逻辑。
命令用于以不同方式在应用程序中共享分组操作。有时我们需要执行相同的活动,WPF 为我们提供了一个名为 Command 的功能,让我们的工作更轻松、更快捷。
基本上有四种类型的命令:
- Application Commands
- Edit Commands
- Component Commands
- Media Commands
XAML
<StackPanel>
<MenuItem Command="ApplicationCommands.Paste" /> </Menu>
<TextBox />
</StackPanel>
// Creating the UI objects
StackPanel mainStackPanel = new StackPanel();
TextBox pasteTextBox = new TextBox();
Menu stackPanelMenu = new Menu();
MenuItem pasteMenuItem = new MenuItem();
// Adding objects to the panel and the menu
stackPanelMenu.Items.Add(pasteMenuItem);
mainStackPanel.Children.Add(stackPanelMenu);
mainStackPanel.Children.Add(pasteTextBox);
// Setting the command to the Paste command
pasteMenuItem.Command = ApplicationCommands.Paste;
// Setting the command target to the TextBox
pasteMenuItem.CommandTarget = pasteTextBox;
问题46:WPF中画布面板的属性是什么?
答:画布是WPF中最基本的布局面板。它的子元素由 显式坐标 定位。可以使用Canvas.Left、Canvas.Top、Canvas.Bottom 和 Canvas.Right 附加属性 相对于面板的任何一侧 指定坐标。
该面板通常用于将 2D 图形元素组合在一起,而不是用于布局用户界面元素。这很重要,因为当您开始调整应用程序的大小、缩放或本地化时,指定绝对坐标会给您带来麻烦。来自 WinForms 的人对这种布局很熟悉——但这在 WPF 中并不是一个好的做法。
在 WPF 中,画布面板具有非常简单的布局。我们可以使用它的两个属性来定位任何对象:
- Canvas.Left
- Canvas.Top
注意: 当我们的普通应用程序在浏览器中调整大小时,画布面板不会自动调整大小。
以下是 Canvas 面板的示例:
<Canvas Background="Pink" Width="250" Height="100">
</Canvas>
问题47:什么是WPF TextBlock?
答:TextBlock 控件是 WPF 中最基本的控件之一,但它非常有用。它允许您将文本放在屏幕上,就像标签控件所做的那样,但是以一种更简单且资源需求更少的方式。一个普遍的理解是 Label 是简短的单行文本(但可能包括例如图像),而 TextBlock 也适用于多行字符串,但只能包含文本(字符串)。Label 和 TextBlock 都有自己独特的优势,所以你应该使用什么取决于具体情况。
创建一个文本块
TextBlock 元素表示 XAML 中的 WPF TextBlock 控件。
<TextBlock/>
TextBlock 元素的 Width 和 Height 属性表示 TextBlock 的宽度和高度。TextBlock 元素的 Text 属性表示 TextBlock 的内容。Name 属性表示控件的名称,它是控件的唯一标识符。Foreground 属性设置内容的前景色。此控件没有 Background 属性。
<TextBlock Name="TextBlock1" Height="30" Width="200"
Text="Hello! I am a TextBlock." Foreground="Red">
</TextBlock>
问题 48:WPF 中的 XAML TabControl 是什么?
答:选项卡控件具有选项卡项,每个选项卡项代表一个用于承载其他控件的容器。
WPF TabControl 允许您将界面拆分为不同的区域,通过单击通常位于控件顶部的选项卡标题可以访问每个区域。选项卡控件通常用于 Windows 应用程序,甚至在 Windows 自己的界面中,例如文件/文件夹的属性对话框等。
与大多数其他 WPF 控件一样,TabControl 非常容易上手。这是一个非常基本的示例:
<Window x:Class="WpfTutorialSamples.Misc_controls.TabControlSample" <Window x:Class="WpfTutorialSamples.Misc_controls.TabControlSample" xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" Title="TabControlSample" Height="200" Width="250">
<TabControl>
<TabItem Header="General">
<Label Content="Content goes here..." /> </TabItem>
<TabItem Header="Security" />
<TabItem Header="Details" /> </TabControl>
</Grid>
</Window>
问题 49:WPF 中的虚拟化是什么?
答:WPF 中的虚拟化技术提高了 UI 元素的渲染性能。通过应用虚拟化,布局系统确保只有容器的可见项在屏幕上呈现。例如,一个列表控件可能有数千个项目,但虚拟化只会减少对可见项目的呈现。
VirtualizingStackPanel: WPF中的VirtualizingStackPanel控件用于实现虚拟化。VirtualizingStackPanel的IsVirtualizing属性激活虚拟化。默认情况下,IsVirtualizing 属性设置为 true。当 IsVirtualizing 设置为 false 时,VirtualizingStackPanel 的行为与普通 StackPanel 相同。
<VirtualizingStackPanel Width="300" Height="200" />
VirtualizingStackPanel.VirtualizationMode 属性有两个值,Standard 和 Recycling。VirtualizationMode 的默认值是 Standard,这意味着 VirtualizingStackPanel 为每个可见项目创建一个项目容器,并在不再需要它时将其丢弃(例如当项目被滚动出视图时)。当 ItemsControl 包含许多项目时,创建和丢弃项目容器的过程会降低性能。在这种情况下,使用 Recycling 会重复使用项目容器,而不是每次都创建一个新容器。
问题 50:WPF 中的 DockPanel 控件是什么?
答:DockPanel 是一个面板,其中每个子元素停靠到四个边缘之一。DockPanel 允许将子元素停靠到面板的整个侧面,使其伸展以填充整个高度或宽度。
DockPanel 可以轻松地在所有四个方向(顶部、底部、左侧和右侧)停靠内容。这使得它在许多情况下都是一个不错的选择,在这些情况下,您希望将窗口划分为特定区域,特别是因为默认情况下,DockPanel 中的最后一个元素,除非特别禁用此功能,否则将自动填充其余空间(中心)。
<Window x:Class="DockPanelExample1.MainWindow" xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" Title="DockPanel Example" Height="350" Width="525">
<DockPanel>
<Button Content="Button1"></Button>
<Button Content="Button2"></Button>