WPF教程
- 格式:pptx
- 大小:142.45 KB
- 文档页数:19
WPF入门指南一:快速入门摘要:WPF是微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分。
本文旨在通过一些简单的示例,让你对WPF有一个概要的认识。
主要内容1.概述2.WPF的组成3.WPF的编程架构4.XAML5.WPF中的控件集一.概述WPF (Windows Presentation Foundation)是微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分。
它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面。
二.WPF的组成WPF的构成组件如下所示,其中PresentationFramework、PresentationCore、milcore三部分是WPF的核心组件:三.WPF的编程架构WPF整体的编程架构如图2所示,可以看到,它其中包含了文档服务、用户界面服务、多媒体服务以及一些其它的基本服务。
在用户界面服务中,提供了应用程序服务、部署服务、控件集、布局以及数据绑定等;在多媒体服务中可以看到WPF几乎可以处理所有的媒体类型,包括图片、音频、视频、动画、2D、3D、文本等。
四.XAML在WPF中提供了两种API,一种是用于普通编程的API,比如我们可以用C#、等语言进行编程,另一种是基于XML的API,称为XAML(Extensible Application Markup Language),引入XAML使得UI代码和应用程序逻辑代码完全分离,它是一种标记语言,支持声明式编程,由于XAML是基于XML的,所以它拥有XML的所有规则和定义,非常容易进行扩展。
看下面两段简单的代码:XAML代码:五.WPF控件集在WPF中,提供了非常丰富的控件集,如表一所示:分类控件Editing CheckBox, ComboBox, PasswordBox, RadioButton, RichTextBox, Slider, TextBoxList Selection ListBox, ListView, TreeViewUser Information Label, ProgressBar, Popup, ToolTipAction Button, ContextMenu, Menu, Separator, StatusBar, Thumb, ToolBarAppearance Border, BulletDecorator, Decorator, Image, ViewboxDialog boxes OpenFileDialog, PrintDialog, SaveFileDialogContainers Expander, GroupBox, RepeatButton, ScrollBar, ScrollViewer, TabControlLayout Canvas, DockPanel, Grid, GridSplitter, Panel, StackPanel, VirtualizingStackPanel, WrapPanelNavigation Frame, HyperlinkDocuments DocumentViewer, FlowDocumentPageViewer, FlowDocumentReader, FlowDocumentScrollViewer以上只是对WPF作一个概要的介绍,在后面的文章中,我会详细的去讲WPF中一些控件的用法\数据绑定、资源处理、样式与模版、文档编程、多媒体编程等内容。
WPF教程二布局之StackPanel面板WPF中的布局面板是用于协助我们在界面上进行元素排列的工具。
本篇教程将介绍WPF中的StackPanel面板,该面板能够按照指定的方向依次排列元素,并根据元素的大小自动调整布局。
StackPanel面板是基于栈的布局,它有一个Orientation属性,用来指定元素的排列方向。
默认情况下,Orientation属性被设置为Vertical,即垂直方向。
这意味着在StackPanel中的元素会按照从上到下的顺序排列。
让我们来看一个简单的示例。
首先,创建一个新的WPF应用程序,并在MainWindow.xaml文件中添加一个StackPanel元素:```xml<Window x:Class="WpfApp1.MainWindow"...Title="MainWindow" Height="450" Width="800"><Grid><StackPanel><!--添加元素--></StackPanel></Grid></Window>```在StackPanel中,我们可以添加任意数量的元素,这些元素将按照指定的方向依次排列。
例如,我们可以添加两个按钮:```xml<StackPanel><Button Content="Button 1" Width="100" Height="30"/><Button Content="Button 2" Width="100" Height="30"/></StackPanel>```默认情况下,按钮在StackPanel中是从上到下排列的。
wpf教程WPF(Windows Presentation Foundation)是适用于Windows应用程序开发的一种技术,它提供了丰富的用户界面功能和灵活的布局方式。
在本教程中,我将向您介绍WPF的基本概念和使用方法。
首先,让我们来了解一下WPF的基本概念。
WPF使用XAML (可扩展应用程序标记语言)作为用户界面的声明式标记语言。
XAML使开发人员能够使用类似于HTML的标记语言来定义界面元素,并将其与后端代码进行绑定。
这种分离界面和逻辑的方式使开发更容易、更灵活。
WPF的界面元素被组织在一个树状结构中,称为逻辑树。
这些元素可以是布局容器(如StackPanel、Grid或DockPanel),也可以是具体的控件(如Button、TextBox或ComboBox)。
通过嵌套和组合这些元素,可以创建出复杂的用户界面。
WPF还提供了一种强大的数据绑定机制,使开发人员能够轻松地将数据模型与界面元素进行绑定。
数据绑定可以在数据发生变化时自动更新界面,从而减少了大量的手动更新代码。
此外,WPF还支持MVVM(Model-View-ViewModel)模式,这是一种用于分离界面逻辑和业务逻辑的模式。
接下来,让我们来看一些常见的WPF控件和布局容器。
WPF提供了许多常用的控件,包括按钮、文本框、复选框、下拉列表等。
这些控件具有丰富的样式和模板,可以自定义外观和行为。
在布局方面,WPF提供了多种容器,例如StackPanel、Grid和DockPanel。
StackPanel是一个简单的垂直或水平堆叠容器,它可以按照添加的顺序依次排列内部元素。
Grid是一个类似于表格的容器,它可以将元素分为行和列,从而实现自由的布局。
DockPanel是一个可以将元素固定在屏幕上方、下方、左侧或右侧的容器。
除了基本的控件和布局容器外,WPF还支持自定义控件和样式。
开发人员可以通过创建自定义控件类,来实现自定义的用户界面元素。
WPF入门教程系列在这个WPF入门教程系列中,我们将探索WPF的基础知识,并通过一些简单的示例来演示如何创建一个基本的WPF应用程序。
1. 了解XAML(eXtensible Application Markup Language)2.创建一个简单的WPF应用程序3.管理用户界面元素在这个教程中,我们将学习如何管理用户界面元素,包括如何设置元素的属性、如何响应用户的操作以及如何使用命令来处理事件。
4.使用数据绑定数据绑定是WPF中一个重要的概念,它可以将数据源与用户界面元素进行连接,使得数据的变化可以自动反映在界面上。
在这个教程中,我们将学习如何使用数据绑定来将数据源与界面元素进行关联。
5.用样式和模板自定义界面样式和模板是WPF中用于自定义用户界面外观的重要特性。
在这个教程中,我们将学习如何创建和应用样式和模板,来改变界面元素的外观。
6.创建自定义的用户界面控件在这个教程中,我们将学习如何创建自定义的用户界面控件,以满足特定的应用程序需求。
我们将了解如何定义控件的外观和行为,并将其添加到我们的应用程序中。
7.使用动画和转换动画和转换是WPF中用于创建生动和交互式用户界面的重要特性。
在这个教程中,我们将学习如何使用动画和转换来改变界面元素的位置、大小、颜色等属性。
8.处理多媒体和图形WPF具有强大的图形和多媒体处理能力,可以用于创建各种各样的视觉效果和交互体验。
在这个教程中,我们将学习如何在WPF应用程序中使用多媒体和图形。
这个WPF入门教程系列将为你提供一个全面的了解WPF的基础知识,并通过实际的示例来演示如何创建一个基本的WPF应用程序。
希望它能帮助你入门WPF,并为你在使用WPF开发应用程序时提供指导。
如何学习WPF详细教程目录CONTENCT •WPF基础概念与介绍•开发环境搭建与配置•XAML语言基础及布局设计•数据绑定与事件处理机制剖析•控件样式与模板定制技巧•动画效果实现与性能优化策略•项目实战:构建完整功能WPF应用程序01WPF基础概念与介绍什么是WPFWPF(Windows Presentation Foundation)是微软推出的基于Windows Vista、Windows 7和Windows 8的桌面应用程序开发框架。
WPF使用一种基于XAML的声明式编程语言和一种基于.NET Framework的代码后编程语言来创建用户界面。
WPF支持创建丰富的、交互式的图形用户界面和数据可视化应用程序。
WPF最初是作为Windows Vista的一部分引入的,后来也被加入到.NET Framework 3.0和后续版本中。
随着Windows 8的推出,WPF逐渐被Windows Runtime(WinRT)所取代,但WPF仍然是一个受支持的框架,并且拥有大量的用户和开发者社区。
目前,WPF仍然是许多企业级桌面应用程序的首选开发框架之一,同时也有许多新的开发者加入到WPF的开发队伍中。
WPF发展历程及现状WPF应用领域与前景01WPF被广泛应用于各种类型的应用程序开发中,包括桌面应用程序、Web应用程序、移动应用程序和游戏开发等。
02随着Windows 10的推出和不断更新,WPF的应用领域也在不断扩大,例如UWP(Universal Windows Platform)应用程序就支持使用WPF开发的控件和库。
03未来,随着技术的不断发展和用户需求的变化,WPF可能会继续演进和改进,以适应新的应用场景和开发需求。
同时,随着.NET Core的推出和跨平台支持的不断加强,WPF也有望在更多平台上得到应用和推广。
02开发环境搭建与配置下载并安装最新版本的Visual Studio,确保选择包含“.NET desktop development”工作负载的安装选项。
wpf 教程WPF教程是一个逐步教你使用WPF(Windows Presentation Foundation)开发应用程序的指南。
WPF是一个用于创建现代化、交互式和美观的Windows应用程序界面的框架。
本教程将帮助你了解WPF的核心概念和基本技术,并教你如何使用这些技术创建功能丰富的界面。
以下是本教程的主要内容:1. 概述WPF:介绍WPF的背景和特点,以及为何选择使用它开发应用程序。
2. XAML基础:学习如何使用XAML(可扩展应用程序标记语言)创建WPF界面,并了解XAML的语法和常用元素。
3. 布局和控件:探索WPF的布局系统和常用控件,包括面板、容器和输入控件。
了解如何使用这些控件创建自适应布局和响应式界面。
4. 数据绑定:学习如何使用数据绑定将数据与界面元素关联起来,并实现数据的双向同步。
5. 样式和模板:了解如何使用样式和模板来自定义控件的外观和行为,并实现视觉一致的界面。
6. 事件和命令:学习如何使用事件和命令处理用户交互和响应,以及如何实现路由事件和自定义命令。
7. 动画和转换:探索WPF的动画和转换功能,实现界面元素的平滑过渡和动态效果。
8. 数据访问和数据库:了解如何在WPF应用程序中使用数据访问技术,包括使用和Entity Framework访问数据库。
9. MVVM设计模式:介绍MVVM(模型-视图-视图模型)设计模式,并展示如何在WPF应用程序中应用该模式以实现松耦合和可测试性。
通过跟随这个教程,你将会掌握WPF的核心概念和技术,能够独立开发功能强大的Windows应用程序界面。
立即开始吧!。
WPF⼊门教程系列(⼀)WPF基础知识快速学习绝不是从零学起的,良好的基础是快速⼊⼿的关键,下⾯先为⼤家摞列以下⾃⼰总结的学习WPF的⼏点基础知识:1) C#基础语法知识(或者其他.NET⽀持的语⾔):这个是当然的了,虽然WPF是XAML配置的,但是总还是要写代码的,相信各位读者应该也都有这个基础了。
2) HTML语⾔:虽然WPF是窗体程序但是由于使⽤的XAML语⾔,如果以前接触过HTML、XHTML、之路的东西的话会,接受这些标签会很有帮助的,如果以前⼀直是从事win form开的⼈来说可能就要适应⼀下了。
3) 对C#中的代理、事件要做到熟练掌握,在.NET 3.0 版本后有增加了Routed Events,要想⽇后不糊涂,这个是基础。
4) 有⼀定的winform或经验,主要是对控件事件的处理要有写了解。
5) 拥有良好的⾯向对象的思想:思想是语⾔的升华(本⼈的OO思想完全是Java中领悟来的)。
在WPF中,经常要灵活运⽤各种继承关系、多态、重载等,因此⼀定要把基础知识打牢固。
6) DataBinding要有所了解:Binding是WPF的⼀⼤亮点,在接触它以前如果接触国⾥⾯的DataBinding的话对相对起来会容易接受⼀点,虽然这两个有⼀定的不同。
7) 对设计模式要有⼀定的了解:当然是越深⼊越好了,在实际项⽬中,各种设计模式经常交融使⽤。
快速的识别并合理的运⽤,⽆论是在开发还是调试时都是⾮常⾼效的。
另外,WPF存在的初衷即是表现与逻辑的松耦合,最普遍的情况就是XAML作为表现层,背后.cs⽂件作为逻辑层。
因此,⽇后在从事项⽬⼯作时,要时刻谨记这⼀点,千万不可背道⽽驰。
不要为了凸显⾃⼰的某⼀些代码特长⽽将各种逻辑混写在⼀起,这样⾮常不实际的,这⼀点都在校⽣应该尤为重要。
8) 对XML的理解:XAML也是XML,对XML的理解绝对有助于快速的接受和使⽤XAML,并不需要多XML有多么⾼深的见解。
wpf经典教程范文WPF(Windows Presentation Foundation)是微软的一种用于创建Windows应用程序的图形用户界面框架。
它为开发人员提供了丰富的界面设计能力和强大的数据绑定机制。
本文将介绍WPF的基本概念和使用方法,帮助读者快速入门和掌握WPF的开发技巧。
一、WPF的基本概念3. 布局:WPF提供了多种布局控件,如Grid、StackPanel、DockPanel等,用于帮助开发人员实现界面的布局。
布局控件可以嵌套使用,使得界面可以按照层级关系进行排列。
4.数据绑定:WPF的数据绑定机制是其最重要的特性之一、通过数据绑定,界面的控件可以实时地反映出数据的变化。
开发人员可以通过将控件的属性与后端的数据源进行绑定,实现数据的自动更新。
二、WPF的使用方法1. 创建WPF应用程序:在Visual Studio中,选择File -> New -> Project,然后在模板列表中选择WPF Application。
在新建的项目中,会生成一个默认的MainWindow.xaml文件,它是WPF应用程序的主窗口。
3.添加事件处理程序:在XAML中,可以为控件的事件指定处理程序。
在后端的C#代码中,可以编写相应的事件处理方法。
通过在XAML中使用事件绑定语法,将控件的事件与事件处理方法进行绑定。
4. 实现数据绑定:首先,需要在后端的C#代码中定义一个数据源,例如一个类的实例。
然后,在XAML中可以使用{Binding}语法将控件的属性与数据源的属性进行绑定。
这样,当数据源的属性发生变化时,控件的属性会自动更新。
三、WPF的开发技巧1. 使用样式:WPF中的样式(Style)是一种重要的界面设计工具,可以统一控件的外观和行为。
通过为控件定义样式,可以减少重复的代码,提高界面的一致性。
2.自定义控件:WPF允许开发人员创建自定义的控件。
通过继承现有的控件类,并重写其方法或添加新的属性,可以实现满足特定需求的控件。
wpf 创建用户控件实例的方法WPF(Windows Presentation Foundation)是一种用于创建Windows 桌面应用程序的技术,它提供了丰富的UI 组件库和样式功能。
在WPF 应用程序中,用户控件(User Control)是一种重要的组成部分,它允许开发者自定义UI 界面。
本文将介绍如何在WPF 中创建用户控件实例,并在应用程序中使用它们。
1.WPF 用户控件概述WPF 用户控件是一种可重用的UI 组件,它可以包含在任何WPF 窗口或页面中。
用户控件可以自定义样式、布局和功能,以满足特定需求。
WPF 提供了两种主要方法来创建用户控件:继承自BaseControl 类和继承自UserControl 类。
2.创建WPF 用户控件的方法2.1 继承自BaseControl 类要使用这种方法,需要创建一个新类,该类继承自BaseControl 类,然后在该类中添加所需的UI 元素和事件处理程序。
以下是一个简单的例子:```csharppublic class MyUserControl : BaseControl{public MyUserControl(){InitializeComponent();}private void Button_Click(object sender, RoutedEventArgs e){MessageBox.Show("按钮被点击了!");}}```2.2 继承自UserControl 类继承自UserControl 类是一种更灵活的方法,因为它允许您使用XAML 标记来定义UI 元素。
以下是一个示例:```csharppublic class MyUserControl : UserControl{public MyUserControl(){InitializeComponent();}private void Button_Click(object sender, RoutedEventArgs e){MessageBox.Show("按钮被点击了!");}}```2.3 使用MarkupExtension 创建自定义控件MarkupExtension 是一种WPF 标记扩展,可用于创建自定义控件。
WPF常用控件和使用方法WPF(Windows Presentation Foundation)是一种用于创建用户界面的技术,它提供了一套丰富的控件库,可以用于构建各种类型的应用程序。
本文将介绍WPF中常用的控件以及它们的使用方法。
1. Button(按钮)按钮是WPF中最基本、最常用的控件之一,用于触发用户操作。
以下是创建和使用按钮的示例:<Button Content="Click Me" Click="Button_Click"/>在上述示例中,我们创建了一个名为”Click Me”的按钮,并通过Click事件指定了点击按钮时要执行的方法。
2. TextBox(文本框)文本框用于接收用户输入或显示文本内容。
以下是创建和使用文本框的示例:<TextBox Text="{Binding UserName}" Width="200"/>上述示例中,我们创建了一个绑定到UserName属性的文本框,并设置其宽度为200个单位。
3. Label(标签)标签用于显示静态文本内容。
以下是创建和使用标签的示例:<Label Content="Hello, World!" FontSize="16"/>在上述示例中,我们创建了一个内容为”Hello, World!“的标签,并设置其字体大小为16个单位。
4. CheckBox(复选框)复选框允许用户从多个选项中选择一个或多个。
以下是创建和使用复选框的示例:<CheckBox Content="Option 1" IsChecked="{Binding Option1}"/>在上述示例中,我们创建了一个名为”Option 1”的复选框,并通过IsChecked属性绑定到Option1属性。
WPF教程(十五)MVVM框架MVVM(Model-View-ViewModel)是一种用于构建用户界面的设计模式,它通过将用户界面的逻辑与数据分离,以实现更好的代码组织和可维护性。
MVVM框架在WPF中得到了广泛应用,它将界面逻辑分离成三个主要部分:- Model:数据模型,用于表示应用程序中的数据和业务逻辑。
- View:用户界面,负责显示数据和与用户交互。
- ViewModel:连接Model和View的中间件,将Model中的数据转换为View可以显示的形式,并处理用户界面的逻辑。
在MVVM中,数据绑定是一个核心概念。
通过数据绑定,Model中的数据可以直接与View进行绑定,并在需要时自动更新。
这样可以避免在代码中手动更新UI,减少了开发者的工作量。
MVVM框架中的ViewModel起到了非常重要的作用,它负责将Model中的数据转换为View可以显示的格式,并提供对数据的操作方法。
ViewModel通常实现了INotifyPropertyChanged接口,用于通知View数据的变化。
下面我们通过一个简单的例子来演示MVVM框架的使用。
首先,我们创建一个名为Person的Model类,它具有两个属性,Name和Age:```csharppublic class Personprivate string _name;private int _age;public string Nameget { return _name; }set { _name = value; }}public int Ageget { return _age; }set { _age = value; }}```接下来,我们创建一个名为PersonViewModel的ViewModel类,它包含一个Person对象和一个保存Person对象集合的ObservableCollection:```csharppublic class PersonViewModel : INotifyPropertyChangedprivate Person _currentPerson;private ObservableCollection<Person> _people;public Person CurrentPersonget { return _currentPerson; }set_currentPerson = value;OnPropertyChanged(nameof(CurrentPerson));}}public ObservableCollection<Person> Peopleget { return _people; }set_people = value;OnPropertyChanged(nameof(People));}}public PersonViewModelCurrentPerson = new Person(;People = new ObservableCollection<Person>(;}public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName)PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}```在ViewModel中,我们维护一个当前选中的Person对象和一个保存所有Person对象的集合。
WPF教程:依赖属性⼀、什么是依赖属性依赖属性就是⼀种⾃⼰可以没有值,并且可以通过绑定从其他数据源获取值。
依赖属性可⽀持WPF中的样式设置、数据绑定、继承、动画及默认值。
将所有的属性都设置为依赖属性并不总是正确的解决⽅案,具体取决于其应⽤场景。
有时,使⽤私有字段实现属性的典型⽅法便能满⾜要求。
MSDN中给出了下⾯⼏种应⽤依赖属性的场景:1. 希望可在样式中设置属性。
2. 希望属性⽀持数据绑定。
3. 希望可使⽤动态资源引⽤设置属性。
4. 希望从元素树中的⽗元素⾃动继承属性值。
5. 希望属性可进⾏动画处理。
6. 希望属性系统在属性系统、环境或⽤户执⾏的操作或者读取并使⽤样式更改了属性以前的值时报告。
7. 希望使⽤已建⽴的、WPF 进程也使⽤的元数据约定,例如报告更改属性值时是否要求布局系统重新编写元素的可视化对象。
⼆、依赖属性的特点1、属性变更通知⽆论什么时候,只要依赖属性的值发⽣改变,wpf就会⾃动根据属性的元数据触发⼀系列的动作,这些动作可以重新呈现UI元素,也可以更新当前的布局,刷新数据绑定等等,这种变更的通知最有趣的特点之⼀就是属性触发器,它可以在属性值改变的时候,执⾏⼀系列⾃定义的动作,⽽不需要更改任何其他的代码来实现。
通过下⾯的⽰例来演⽰属性变更通知⽰例:当⿏标移动到Button按钮上⾯时,⽂字的前景⾊变为红⾊,离开时变为默认颜⾊⿊⾊,采⽤传统⽅式和依赖属性两种⽅式实现:(1)、使⽤传统⽅式实现,在Button按钮上定义MouseEnter和MouseLeave两个事件,分别处理⿏标移动到按钮上⾯和离开,XAML界⾯代码:1 <Window x:Class="WpfDemo.MainWindow"2 xmlns="/winfx/2006/xaml/presentation"3 xmlns:x="/winfx/2006/xaml"4 Title="Grid⾯板" Height="237" Width="525" WindowStartupLocation="CenterScreen">5 <Grid >6 <Button Height="30" Width="200" MouseEnter="Button_MouseEnter" MouseLeave="Button_MouseLeave" >⿏标移动到上⾯,前景⾊变为红⾊</Button>7 </Grid>8 </Window>C#后台代码实现:1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 using System.Threading.Tasks;6 using System.Windows;7 using System.Windows.Controls;8 using System.Windows.Data;9 using System.Windows.Documents;10 using System.Windows.Input;11 using System.Windows.Media;12 using System.Windows.Media.Imaging;13 using System.Windows.Navigation;14 using System.Windows.Shapes;1516 namespace WpfDemo17 {18 /// <summary>19 /// MainWindow.xaml 的交互逻辑20 /// </summary>21 public partial class MainWindow : Window22 {23 public MainWindow()24 {25 InitializeComponent();26 }2728 /// <summary>29 /// ⿏标移动到按钮上⾯30 /// </summary>31 /// <param name="sender"></param>32 /// <param name="e"></param>33 private void Button_MouseEnter(object sender, MouseEventArgs e)34 {35 Button btn = sender as Button;36 if (btn != null)37 {38 btn.Foreground = Brushes.Red;39 }40 }4142 /// <summary>43 /// ⿏标离开按钮44 /// </summary>45 /// <param name="sender"></param>46 /// <param name="e"></param>47 private void Button_MouseLeave(object sender, MouseEventArgs e)48 {49 Button btn = sender as Button;50 if (btn != null)51 {52 btn.Foreground = Brushes.Black;53 }54 }55 }56 }(2)使⽤依赖属性实现,XAML界⾯代码:1 <Window x:Class="WpfDemo.MainWindow"2 xmlns="/winfx/2006/xaml/presentation"3 xmlns:x="/winfx/2006/xaml"4 Title="Grid⾯板" Height="237" Width="525" WindowStartupLocation="CenterScreen">5 <Grid >6 <Button Height="30" Width="200">⿏标移动到上⾯,前景⾊变为红⾊7 <Button.Style>8 <Style TargetType="Button">9 <Style.Triggers>10 <Trigger Property="IsMouseOver" Value="true">11 <Setter Property="Foreground" Value="Red"></Setter>12 </Trigger>13 </Style.Triggers>14 </Style>15 </Button.Style>16 </Button>17 </Grid>18 </Window>使⽤上⾯的两种⽅式都可以实现Button按钮的前景⾊改变,效果如下:在判断属性IsMouseOver的值为false的时候,⾃动将Foreground的值改为之前的值,因此就不需要写IsMouseOver的值为false的时候,将Foreground的值改为Black。