C#基础知识回顾(第三部分 共四部分)

第6章 目录与文件操作

目录

    • 第6章 目录与文件操作
      • 6.1 目录和文件管理
        • 6.1.1 Environment类和DriveInfo类
        • 6.1.2 Path类
        • 6.1.3 目录管理
        • 6.1.4 文件管理
      • 6.2 文件的读写
        • 6.2.1 文件编码
        • 6.2.2 文本文件的读写
        • 6.2.3 StreamReader类和StreamWriter类
        • 6.2.4 二进制文件的读写
    • 第7章 WPF应用程序入门
      • 7.1 WPF应用程序和XAML标记
      • 7.2 窗口和对话框
        • 7.2.1 WPF窗口
        • 7.2.2 窗口的外观和行为
        • 7.2.3 对话框
        • 7.2.4 WPF页和页面导航
      • 7.3 颜色
      • 7.4 形状
      • 7.5 画笔
        • 7.5.1 画笔分类
        • 7.5.2 纯色画笔(SolidColorBrush)
        • 7.5.3 线性渐变画笔(LinearGradientBrush)
        • 7.5.4 径向渐变画笔(RadialGradientBrush)
        • 7.5.5 图形画笔(ImageBrush)
      • 7.6 属性
      • 7.7 事件
    • 第8章 WPF控件
      • 8.1 控件模型和内容模型
        • 8.1.1 WPF控件模型
        • 8.1.2 WPF内容模型
      • 8.2 常用布局控件
        • 8.2.1 WPF的布局分类
      • 8.3 常用基本控件
      • 8.4 菜单、工具条和状态条

6.1 目录和文件管理

6.1.1 Environment类和DriveInfo类

Environment类:使用Environment类可检索与操作系统相关的信息

常用静态属性

1.CurrentDirectory属性:获得程序集所在的文件夹;2.OSVersion属性:获取操作系统版本(PC,PDA均支持);3.NewLine属性:获取当前环境换行符(PC支持);4.Version属性:显示公共语言运行时版本的对象;5.GetLogicalDrives方法:列举本地硬盘驱动器(PC支持);6.GetFolderPath方法:获取系统保留文件夹路径(PC,PDA均支持)

DriveInfo类:使用DriveInfo可以确定当前可用的驱动器以及这些驱动器的类型,还可以通过查询来确定驱动器的容量和剩余空间

DriveInfo[] allDrives = DriveInfo.GetDrives( );
foreach (DriveInfo d in allDrives)
{
    Console.WriteLine("Drive {0}", d.Name);
    Console.WriteLine("文件类型: {0}", d.DriveType);
    if (d.IsReady == true)
    {
        Console.WriteLine("卷标: {0}", d.VolumeLabel);
        Console.WriteLine("文件系统: {0}", d.DriveFormat);
        Console.WriteLine("当前用户可用空间:{0} bytes", d.AvailableFreeSpace);
        Console.WriteLine("总可用空间:{0} bytes", d.TotalFreeSpace);
        Console.WriteLine("驱动器总容量:{0} bytes ", d.TotalSize);
    }
}

6.1.2 Path类

Path类用于对包含文件或目录路径信息的String实例执行操作,常用方法:

1.GetDirectoryName方法:得到文件的文件夹路径;2.GetExtension方法:从文件路径字符串中得到文件的扩展名;3.GetFileName方法:从路径字符串中得到文件名(带扩展名);4.GetFileNameWithoutExtension方法:从路径字符串中得到文件名(不带扩展名);5.GetFullPath方法:从文件字符串中得到包括文件名和扩展名的全路径名;

6.1.3 目录管理

Directory类和DirectoryInfo类均可用于对磁盘和目录进行管理,如复制、移动、重命名、创建、删除目录等

两个类的不同点在于DirectoryInfo类提供了更详细的功能,而且必须被实例化后才能使用,而Directory类则只提供了常用的静态方法

Directory类提供的静态方法:

1.CreateDirectory:创建指定路径中的所有目录;2.Delete:删除指定的目录;3.Move:将文件或目录及其内容移到新位置;4.Exists:判断目录是否存在;5.GetCurrentDirectory:获取应用程序的当前工作目录

6.1.4 文件管理

System.IO命名空间中文件操作类:(1)File类;(2)FileInfo类

相同点:都能完成对文件的复制、移动、重命名、创建、打开、删除和追加到文件操作

不同点:FileInfo类提供实例化后的属性、方法,File 只提供静态方法

用法与Directory和DirectoryInfo相似

复制文件: File.Copy(path1, path2, true);,true表示如果目标文件已存在,就直接覆盖

获取或设置文件属性

File类提供了SetAttributes方法和GetAttributes方法。用来获取或设置文件的各种属性。方法原型为:

public static void SetAttributes(string path, FileAttributes fileAttributes)
public static FileAttributes GetAttributes(string path)

在SetAttributes方法中,使用FileAttributes枚举来获取或设置目录或文件的属性,程序中可以利用按位操作“&”、“|”等设置或获取单个属性

“&:按位与;”|":按位或;

判断某个路径是目录还是文件

if ((File.GetAttributes(path) & FileAttributes.Directory) == FileAttributes.Directory){
    Console.WriteLine("{0}是目录", path);}
else{
    Console.WriteLine("{0}是文件", path);}

6.2 文件的读写

在System.IO命名空间中,提供了多种类用于进行数据文件和数据流的读写操作:

1.文件编码,提供多种编码;2.文本文件的读写;3.二进制文件的读写

6.2.1 文件编码

常见的文件编码方式:ASCII、Unicode、UTF8、ANSI、GB2312、GB18030

System.TextEncoding类:表示字符编码,常用有

Encoding.Default 表示操作系统的当前ANSI编码
Encoding.Unicode Unicode编码
Encoding.UTF8 UTF8编码

注意打开文件时指定的编码格式一定要和保存文件时所用的编码格式一致,否则看到的可能就是一堆乱码

6.2.2 文本文件的读写

ReadAllText方法和AppendAllText方法:

string path = @“E:\ls\MyTest.txt";
if (File.Exists(path))
{
    File.Delete(path);
}
string appendText = "你好。" + Environment.NewLine;
File.AppendAllText(path, appendText,Encoding.Default);
string readText = File.ReadAllText(path,Encoding.Default);
Console.WriteLine(readText);

ReadAllLines方法和WriteAllLines方法

string path = @"c:\temp\MyTest.txt";
if (File.Exists(path))
{
    File.Delete(path);
}
string[] appendText ={ "单位","姓名","成绩"};
File.WriteAllLines(path, appendText,Encoding.Default);
string[] readText = File.ReadAllLines(path,Encoding.Default);
Console.WriteLine(string.Join(Environment.NewLine, readText));

6.2.3 StreamReader类和StreamWriter类

流是字节序列的抽象概念:提供了连续的字节流存储空间,也是进行数据读取操作的基本对象

流有如下几种操作:

  • 读取:从流中读取数据到变量中
  • 写入:把变量中的数据写入到流中
  • 定位:重新设置流的当前位置,以便随机读写

注意:StreamReader、StreamWriter的默认编码为UTF-8

StreamReader类

try
{
    using (StreamReader sr = new StreamReader("TestFile.txt"))
    {
        String line;
        while ((line = sr.ReadLine( )) != null)
        {
            Console.WriteLine(line);
        }
    }
}
catch (Exception e)
{
    Console.WriteLine("The file could not be read:");
    Console.WriteLine(e.Message);
}

StreamWriter类

try
{
    using (StreamWriter sw = new StreamWriter("TestFile.txt"))
    {
        sw.WriteLine("First line");
        sw.WriteLine("The date is: {0}", DateTime.Now);
    }
}
catch (Exception e)
{
    Console.WriteLine("The file could not be write:");
    Console.WriteLine(e.Message);
}

6.2.4 二进制文件的读写

System.IO.BinaryReader和BinaryWriter类:按二进制模式读写文件

  1. BinaryReader:ReadByte、ReadBoolean、ReadInt、ReadInt16、ReadDouble和ReadString等
  2. BinaryWriter:提供了与BinaryReader对应的多种重载的Write方法

第7章 WPF应用程序入门

7.1 WPF应用程序和XAML标记

WPF:WPF是一种“以属性为核心”的编程模型。主要用于开发C/S客户端程序(比如QQ、360安全卫士、飞信、股票软件、……等),WPF基于DirectX和GPU加速来实现的图形界面显示技术,WinForm的界面是全部用C#代码实现,WPF的界面除了用C#来实现以外,还可以用XAML来实现

APP类:App类的基类为Application类,该类主要定义在整个应用程序范围内都可以使用的资源和属性

程序的启动:程序从Main方法开始启动,但该方法被隐藏了,改为让开发人员通过App.xaml文件来设置

<Application x:Class="Source.App"
        …… 
       StartupUri="MainWindow.xaml">
       <Application.Resources>
            ……
       Application.Resources>
Application>

App类常用的属性、方法和事件

StartupUri属性:在App.xaml中设置;

MainWindow属性:当App的Shutdown模式为MainWindow时才需要在App.xaml.cs的构造函数中设置此属性(指定谁是主窗口):

public partial class App : Application
{
     public App()  {    //在此处设置......    }
}

其他属性:在任何一个窗口或页面中都可以获取或设置

WPF应用程序的关闭模式

  • 可以在App.xaml中通过ShutdownMode指定关闭模式:
 <Application x:Class="Source.App" 
    ……ShutdownMode="OnMainWindowClose"
    StartupUri="MainWindow.xaml">

ShutdownMode屬性的取值:1.OnLastWindowClose(默认):当关闭最后一个窗口时自动关闭应用程序;2.OnMainWindowClose:当关闭主窗口时自动关闭应用程序;3.OnExplicitShutdown:仅当显式调用Shutdown方法时,才关闭应用程序;

  • 不论哪种关闭模式,只要调用App.Current.Shutdown()方法,都会立即关闭应用程序

XMAL命名空间和x:前缀编程构造:声明XAML命名空间解决了XAML标记和C#代码共享的问题

  1. 根元素和XAML命名空间
  • 一个XAML文件(扩展名为.xaml的文件)只能有一个根元素
  • x:Class用于将XAML和代码隐藏类关联
  • xmlns特性声明XAML默认的命名空间
  1. x:前缀编程构造
  • 根元素的xmlns:x用于XAML命名空间映射,目的是为了通过x:前缀声明可被其他XAML和C#代码引用的对象
  • 控件的Name特性:声明的目的是为了在代码隐藏类中引用它
  • 只有在模板、自定义控件、动画等特殊场合才需要用x:Name特性
  1. 在XAML中映射自定义命名空间
  • 在XAML中引用自定义对象,必须在XAML中映射自定义命名空间

补充:在XAML中自定义命名空间

<Page x:Class="Source.ch07.Page1"
       …… 
       xmlns:my="clr-namespace:Source.ch07"
       …… 
Title="ch07Page1">
      <StackPanel>
           ……
          <my:UserControl1 x:Name="uc1" />
      StackPanel>
Page>
//如果将x:Name改为Name,在代码隐藏类中将看不到uc1
//StackPanel:纵向(默认)或横向堆叠布局

XAML基本语法

概念:XAML的语法与HTML的语法非常相似,即都是利用元素、特性(Attribute)和属性(Property)来描述元素对象的各种要素,XAML中的对象名、特性名以及属性名都区分大小写

(1)对象元素语法
对象是指类的实例,在XAML中用对象元素来描述。例如:

(2)特性语法(最常用)
用特性(Attribute)来描述对象的属性(Property),特性名和特性值之间用赋值号(=)分隔,特性的值始终用字符串来指定,引号默认用双引号,也可以是单引号,原则是“值”两边的引号必须匹配 。例如:

特性语法还可用于描述事件成员 。例如:
Click Me!

(3)属性语法:有时仅仅用特性语法无法来描述对象的某些属性,此时可以用属性语法来描述。一般格式为:
<类名.属性名>……
例如:

<Button Background="Blue" Foreground="Red"
    Content="右击观察快捷菜单" Margin="73,108,74,115">
    <Button.ContextMenu>
        <ContextMenu>
            <MenuItem>快捷菜单项1MenuItem>
            <MenuItem>快捷菜单项2MenuItem>
        ContextMenu>
    Button.ContextMenu>
Button> 

(4)集合语法:如果某个属性采用集合类型,可以使用集合语法 。例如(这段代码是利用【属性】窗口设置后自动生成的):

<Window.Background>
    <LinearGradientBrush>
      <LinearGradientBrush.GradientStops>
        <GradientStop Offset="0.0" Color="Red" />
        <GradientStop Offset="1.0" Color="Blue" />
      LinearGradientBrush.GradientStops>
    LinearGradientBrush>
Window.Background>

(5)XAML内容属性:内容属性的用途是为了简化标记,或者用于嵌套子元素。例如:
This is a Text Box
相当于:

(6)内容属性和集合语法组合

<StackPanel>
    <Button>按钮1Button>
    <Button>按钮2Button>
StackPanel>

(7)类型转换器
将用字符串进行设置的特性值转换为其他对象类型或基元值。例如:

<Button Margin="10,20,30,40" Content="确定"/>  
//相当于:
<Button Content="确定">
    <Button.Margin>
        <Thickness Left="10" Top="20" Right="30" Bottom="40"/>
    Button.Margin>
Button>

XAML中的空白处理

XAML中的空白字符包括空格、换行符、制表符等,默认情况下,XAML处理器会将所有空白字符自动转换为空格

注意:默认情况下,连续的多个空格将被替换为“一个”空格

如果希望保留文本字符串中的多个空格,可以在该元素的开始标记内添加xml:space=“preserve”特性,但是注意要避免在根级别指定该特性,否则会影响XAML处理的性能

7.2 窗口和对话框

7.2.1 WPF窗口

窗口分类:WPF窗口由非工作区和工作区两部分构成 ,非工作区主要包括图标、标题、系统菜单、按钮和边框

通过【WindowStyle】属性可设置窗口样式:

1.标准窗口(SingleBorderWindow,默认);

2.无标题窗口(None):只有工作区部分;

3.工具窗口(ToolWindow):非工作区的右上角只有关闭按钮,不包括最小化、最大化和还原按钮;

4.通知图标(NotifyIcon);

窗口生存周期:(从第一次打开窗口到关闭窗口经历的一系列过程)

激活窗口

活动窗口:当前正在捕获用户输入(如键盘或鼠标等)的窗口

首次打开一个窗口时,该窗口便成为活动窗口。当窗口变为活动窗口时,会引发Activated事件 --> 当前活动窗口停用时引发Deactivated事件 --> 利用IsActive属性可检查窗口是否处于活动状态

创建并显示新窗口:在C#代码中调用Show方法(无模式窗口)或者ShowDialog方法(模式窗口)显示窗口,对于“无模式”窗口,调用Hide方法可将其隐藏

关闭窗口:直接调用Close方法即可关闭当前打开的窗口,窗口关闭时会引发两个事件:Closing事件和Closed事件

窗口关联:通过设置子窗口的Owner属性让该子窗口附属于其父窗口

Window ownedWindow = new Window();
ownedWindow.Owner = this;
ownedWindow.Show(); 

7.2.2 窗口的外观和行为

外观:指用户看到的窗口表现形式,行为:指用户与窗口交互的方式

窗口大小:窗口大小由Width、MinWidth、MaxWidth、Height、MinHeight、MaxHeight以及SizeToContent等多个属性确定,检测窗口当前宽度和高度:应该检查 ActualWidth和ActualHeight属性

窗口位置:通过Left和Top属性获取或更改窗口相对于屏幕坐标的x和y位置,WindowStartupLocation属性设置窗口第一次显示时的初始位置,枚举值有:Manual(默认)、CenterScreen、CenterOwner

z顺序和最顶层窗口:最顶层z顺序中的窗口总是位于正常z顺序中的窗口之上,将窗口的Topmost属性设置为true可以使该窗口位于最顶层z顺序中

7.2.3 对话框

消息框( MessageBox类)

调用静态Show方法显示消息框,常用重载形式有:

  • public static DialogResult Show(string text)
  • public static DialogResult Show(string text, string caption)
  • public static DialogResult Show(string text, string caption, MessageBoxButton buttons,MessageBoxImage icon)

参考链接:

C# McssageBox:消息框

通用对话框

参考链接:

C#界面设计之通用对话框的使用

自定义对话框:自定义对话框一般用于显示和收集特定的信息,分为模式对话框(调用ShowDialog方法显示)和非模式对话框(调用Show方法显示)

7.2.4 WPF页和页面导航

要点:(1)在WPF应用程序中,既可以用窗口(Window)设计界面,也可以用页(Page)设计界面;(2)用Page时,可通过Frame或者NavigationWindow来承载

在Frame中承载Page(常用):在Frame元素中将其Source属性设置为导航到的页 ,在这种方式下,既可以用XAML加载页并实现导航,也可以用C#代码来实现

//用XAML实现
<Frame Name="frame1" NavigationUIVisibility="Visible"  Source="Page1.xaml" Background="#FFF9F4D4" />

//用C#实现
frame1.Source = new Uri("Page1.xaml", UriKind.Relative);

7.3 颜色

任何一种颜色都是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化和它们相互之间的叠加来得到的

通过Alpha通道可控制颜色的透明度

常用颜色格式:#aarrggbb

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="Label">
            "Margin" Value="0 5" />
            "Content" Value="Hello" />
            "Foreground" Value="White" />
        Style>
    StackPanel.Resources>
    <Label Background="#FF5E7C4C" />
    <Label Background="#FF1A36E6" />
    <Label Background="#FFE63F1A" />
StackPanel>

Brushes类和Colors类

在System.Windows.dll中的System.Windows.Media命名空间下的Brushes类和Colors类都利用静态属性提供了预定义的颜色,这些颜色在各种应用程序中都可以使用。如设置控件的前景色、背景色、边框色等

Brushes类的C#语法(隐藏类,sealed表示该类不能被继承):public sealed class Brushes

Colors类的C#语法:public sealed class Colors

这两个类都只能通过他们提供的静态属性获取或设置颜色

Color结构

该结构通过A(透明度)、R(红色通道)、G(绿色通道)和B(蓝色通道)的组合来创建各种自定义的颜色,一般形式为:“#rrggbb”或者“#aarrggbb”

其中#表示十六进制,aa表示透明度,rr表示红色通道,gg表示绿色通道,bb表示蓝色通道

7.4 形状

要点:(1)形状的基类是Shape类,其他类(Ellipse、Line、Path、Polygon、Polyline 和 Rectangle)都是该类的扩充类;(2)Canvas 面板是用于创建复杂绘图的特别理想的选择,因为它支持对其子对象的绝对定位

形状控件共有的属性

  • Stroke:绘制形状轮廓
  • StrokeThickness:指定形状轮廓的粗细
  • Fill:填充形状的内部
  • Stretch:None(不拉伸)、 Fill(拉伸、不保留长宽比);Uniform(尽可能拉伸,并保留其原始长宽比);UniformToFill(完全拉伸,并保留其原始长宽比)

矩形:Rectangle类用于绘制矩形

<Canvas>
    <Rectangle Width="100" Height="100" Fill="Blue" Stroke="Red" 
        Canvas.Top="20" Canvas.Left="20" StrokeThickness="3" />
Canvas>

椭圆:Ellipse类用于绘制椭圆,当Width和Height相等时,绘制的实际上是一个圆

<Canvas Background="LightGray"> 
    <Ellipse Height="75" Width="75"
         Fill="#FFFFFF00" StrokeThickness="5" Stroke="#FF0000FF"/>
Canvas>

其他基本形状

  1. Line(直线)
<Line X1="10" Y1="10" X2="50" Y2="50" Stroke="Black" StrokeThickness="4" /> 
  1. PolyLine(多条依次相连的直线)
<Canvas>
    <Polyline Points="50,25 0,100 100,100 50,25"
      Stroke="Blue" StrokeThickness="10" Canvas.Left="75" Canvas.Top="50" />
Canvas> 
  1. Polygon(多边形)该控件和PolyLine用法相似,但它会自动将最后1个点和第1个点连起来
<Canvas>
    <Polygon Points="300,200 400,125 400,275" Stroke="Purple" StrokeThickness="2">
        <Polygon.Fill>
            <SolidColorBrush Color="Blue" Opacity="0.4"/>
        Polygon.Fill>
    Polygon> 
Canvas>   

7.5 画笔

在WPF应用程序中,画笔(Brush)是所有控件都具有的基本功能。最常见的是利用画笔设置控件的前景色、背景色,填充渐变色、图像和图案

7.5.1 画笔分类

(1)画笔的所有类型都在System.Windows.Media命名空间下
(2)Brush类是各种画笔的抽象基类,其他画笔类型都是从该类继承
(3)常用画笔类型:

  • ​ 纯色画笔:单一颜色
  • ​ 渐变画笔:包括线性渐变、径向渐变
  • ​ 图像画笔:可将图像作为画笔

(4)在XAML或者文档大纲中选中某个控件后,可直接利用【属性】窗口设置画笔类型

7.5.2 纯色画笔(SolidColorBrush)

创建SolidColorBrush实例后,可通过Color类提供的方法设置颜色

SolidColorBrush b = new SolidColorBrush();
b.Color = Color.FromArgb(0xFF, 0xFF, 0x0, 0x0);
button1.Background = b; 

7.5.3 线性渐变画笔(LinearGradientBrush)

(1)含义:沿一条直线(即渐变轴)定义的渐变绘制区域
(2) 用 StartPoint 和 EndPoint 设置渐变的起点和终点,用GradientStop设置渐变停止点的颜色、偏移量
(3)如果不指定渐变方向,默认创建对角线渐变。

<StackPanel>
    <Rectangle Width="200" Height="100">
        <Rectangle.Fill>
            <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
                <GradientStop Color="Yellow" Offset="0.0" />
                <GradientStop Color="Red" Offset="0.25" />
                <GradientStop Color="Blue" Offset="0.75" />
                <GradientStop Color="LimeGreen" Offset="1.0" />
            LinearGradientBrush>
        Rectangle.Fill>
    Rectangle>
StackPanel> 

7.5.4 径向渐变画笔(RadialGradientBrush)

(1) 含义:以一个椭圆为边界,从椭圆中心点开始由内向外逐渐填充渐变的颜色

(2)画笔由原点(GradientOrigin)、中心点(Center)和辐射到的范围(RadiusX、RadiusY)来定义

<StackPanel>
    <Rectangle Width="200" Height="100">
        <Rectangle.Fill>
            <RadialGradientBrush GradientOrigin="0.5,0.5" 
                         Center="0.5,0.5 " RadiusX="0.5" RadiusY="0.5">
                <GradientStop Color="Yellow" Offset="0" />
                <GradientStop Color="Red" Offset="0.25" />
                <GradientStop Color="Blue" Offset="0.75" />
                <GradientStop Color="LimeGreen" Offset="1" />
            RadialGradientBrush>
        Rectangle.Fill >
    Rectangle>
StackPanel>  

7.5.5 图形画笔(ImageBrush)

(1) 含义:使用 ImageSource 绘制一个区域。
(2)XAML示例

<Rectangle Width="75" Height="75">
  <Rectangle.Fill>
    
  Rectangle.Fill>
Rectangle>

(3)C#示例

Rectangle r = new Rectangle{Width = 75, Height = 75};
ImageBrush b = new ImageBrush();
b.ImageSource = new BitmapImage(new Uri(@“images\p1.jpg", UriKind.Relative));
r.Fill = b;

7.6 属性

CLR属性:用get和set访问器实现的属性称为CLR属性

依赖项属性( DependencyProperty )

  • 封装CLR属性,目的是为了用XAML描述这些属性
  • 主要用于样式、主题、数据绑定、动画、元数据重写、属性值继承以及WPF设计器集成等情况
  • 每个CLR属性都有与其对应的依赖项属性,反之亦然

附加属性:在某个子元素上指定其父元素的属性,用于设置子元素相对于父元素的布局方式(例如停靠方式等)

利用样式资源控制控件的属性

(1)分类:内联式、嵌入式(用框架元素样式和应用程序样式实现)和外部链接式(用资源字典实现)
(2)如果某些控件具有相同的属性,在其父级元素的资源中用Style单独设置这些属性的样式以后,这些控件就会自动应用这些样式

7.7 事件

**在XAML中注册事件 **:在XAML中,声明事件的一般形式为 事件名=“事件处理程序名”
或者: 子元素类型名.事件名=“事件处理程序名”

一般通过事件列表附加事件

<Button Name="Btn1" Click="Btn1_Click"/>

在C#代码中注册事件:利用+=注册事件,利用-=取消注册

public MainWindow(){
    InitializeComponent();
    Button1.MouseDoubleClick += Button1_MouseDoubleClick;}
void Button1_MouseDoubleClick(object sender, MouseButtonEventArgs e){
    //事件处理代码}

事件处理程序中的参数:所有WPF事件处理程序默认都提供两个参数

private void OkButton_Click(object sender, RoutedEventArgs e) 

参数sender包括附加该事件的对象,参数e是数据源的相关数据

事件使用要点

(1)在WPF中,绝大部分情况下都是用e.Source来判断事件源是谁
(2)大部分情况下通过【属性】窗口直接设置某元素的事件
(3)如果具有相同类型的元素很多,而且这些元素都会引发某个相同的事件,此时可以在其父元素中声明附加事件(可简化事件声明的次数)

事件路由:直接、冒泡和隧道三种方式

1)直接路由: 直接(Direct)是指该事件只针对元素自身,而不会再去路由到其他元素

2)冒泡 :冒泡(Bubble)是指从事件源依次向父元素方向查找,直到查找到根元素为止,目的是搜索父元素中是否包含针对该元素的附件事件声明

利用“冒泡”可在某个父元素上一次性地为多个子元素注册同一个事件:

<StackPanel …… Button.Click="Button_Click"  ……>
      <Button Name="YesButton" Content="" Width="54" />
      <Button Name="NoButton" Content="" Width="65"/>
      <Button Name="CancelButton" Content="取消" Width="64"/>
StackPanel>

3)隧道路由 :隧道(Tunnel)是指从根元素开始向子元素依次路由,直到查找到事件源为止,它与冒泡路由刚好是相反的过程

<Window ……>
        <Border ……>
            <StackPanel ……
                 Button.PreviewMouseMove="Button_PreviewMouseMove"
                 ……>
                <Button Name="YesButton" Content="" Width="54" />
                <Button Name="NoButton" Content="" Width="65"/>
                <Button Name="CancelButton" Content="取消" Width="64"/>
            StackPanel>
        Border>
Window> 

鼠标事件

RoutedEventArgs的Source属性和OriginalSource属性:

RoutedEventArgs的Source属性:判断是哪个元素引发的事件

OriginalSource属性:一般用于判断是该元素中的哪个子项引发的事件

1)获取鼠标的位置 :GetPosition(IInputElement)方法:获取鼠标光标所在点相对于指定控件左上角的位置

参数取值:

  • null或this:相对于根元素内容区域的坐标
  • sender:基于针对其处理事件的对象的内部坐标进行计算
  • 指定元素对象:相对于指定对象的左上角

2)保存和恢复控件状态 :每个控件都有一个Object类型的Tag属性,利用这个属性,可以保存和恢复控件变化前后的多个状态。

3)设置鼠标的光标形状 :Mouse类中有一个OverrideCursor属性,利用该属性可动态改变光标的形状

Mouse.OverrideCursor = Cursors.Hand;  

键盘事件:要使某个控件接受键盘事件,必须将该控件的Focusable属性设置为true

传递的事件名 功能描述
KeyDown 当按下键盘时产生
KeyUp 当释放键盘时产生
GotKeyboardFocus 当元素获得输入焦点时产生
LostKeyboardFocus 当元素失去输入焦点时产生

触摸板事件

在WPF应用程序中,可以同时接收来自多个触控的输入,并在发生触控时(如食指双击、手势移动、拇指和食指分开放大、拇指和食指并拢缩小等)引发相应的事件

第8章 WPF控件

8.1 控件模型和内容模型

WPF控件两种最基本的模型:控件模型、内容模型

8.1.1 WPF控件模型

组成要素

  • 内容:指显示控件内容的区域,可以是文本、图像或其他控件元素

  • Padding:内边距。即边框和内容之间的矩形环区域

  • 边框:即内边距和外边距之间的黑色矩形环区域

  • Margin:外边距。指边框和图中虚线包围的矩形环区域,表示该控件和其他控件之间的距离,常用有两种形式,一种是用一个值来描述,另一种是按照“左、上、右、下”的顺序用4个值分别描述。例如下面的代码表示Button2按钮的左、上、右、下的外边距分别是0、10、0、10

  • 内边距(Padding):控制元素内部与其子元素或文本之间的间距,其用法和Margin属性的用法相似

对齐方式

  • 水平对齐(HorizontalAlignment) :声明元素相对于其父元素的水平对齐方式
成 员 说 明
Left、Center、Right 子元素在其父元素内左端对齐、中心对齐、右端对齐
Stretch(默认) 拉伸子元素至父元素的已分配空间。如果声明了Width和Height,则Width和Height优先
  • 垂直对齐(VerticalAlignment):描述元素相对于其父元素的垂直对齐方式。可能的取值分别为Top(顶端对齐)、Center(中心对齐)、Bottom(底端对齐)和Stretch(默认,垂直拉伸)

8.1.2 WPF内容模型

WPF内容模型是指如何组织和布局WPF控件的内容。用XAML描述控件元素时,一般语法形式为:

<控件元素名>
内容模型

1. Text和Inlines

Text内容模型表示一段字符串。TextBox、PasswordBox都属于Text内容模型

Xaml: 这是一段文本
C#: textBox1.Text=“这是一段文本”;

Inlines内容模型也表示一段字符串文本 ,和Text的区别是Inlines可以对其中的子字符串分别设置字体名称、粗体、斜体等样式

<TextBlock Name="textBlock1" TextWrapping="Wrap">
    利用<Bold>该控件Bold>可以<Italic>快速显示Italic>少量的文本
TextBlock>

2. Content:

Content内容模型表示该内容是一个对象,该对象可以是文本、图像及其他元素。像Button、RepeatButton、CheckBox、RadioButton及Image都属于该模型

3. HeaderedContent:

HeaderedContent表示其内容模型为1个标题和1个内容项,二者都是任意对象。
TabItem是一个特殊类型的内容控件,利用它可设置内容和标题

4. Items:

Items表示一个项集合。可以通过设置控件的Items属性来直接填充该控件的每一项

WPF应用程序中创建控件对象的方式

在WPF应用程序中,有两种创建控件对象的方式
(1)静态(固定不变)元素一般用XAML来实现。
(2)动态变化的元素(添加删除元素由其他因素决定)一般用C#代码来实现

8.2 常用布局控件

8.2.1 WPF的布局分类

布局方式有:绝对定位(图形一般采用绝对定位)、动态定位

实际开发中,除了Canvas的子元素采用绝对布局外,其他布局元素内的元素都应该采用动态布局

  1. 网格 (Grid)

(1)是所有动态布局控件中唯一可按比例动态调整分配空间的控件

(2)Grid内的子元素中还可以嵌套Grid

Grid子元素使用以下附加属性来定位:

  • 用Grid.Row、Grid.Column指定子元素所在的行和列,在C#代码中用Grid.SetRow方法和Grid.SetCol方法指定
  • Grid.RowSpan跨多行。例如Grid.RowSpan="2"表示跨2行
  • Grid.ColumnSpan跨多列。例如Grid.ColumnSpan ="2"表示跨2列

(3)自动调整行高和列宽(Auto、*)

  1. 堆叠面板(StackPanel)

将子元素按纵向或横向顺序排列或堆叠。没有重叠的时候称为排列,有重叠的时候称为堆叠

常用属性:Orientation属性,排列或堆叠的方向。默认为纵向,如果希望横向排列或堆叠,将该属性设置为“Horizontal”即可

  1. 画布(Canvas)

Canvas用于定义一个区域,称为画布。在该画布内的所有子元素都用相对于该区域左上角的坐标位置x和y来定位,优点是执行效率高,缺点是其子元素无法动态定位,也无法自动调整大小

以下情况应该使用绝对定位布局:

1.当区域内只有一个图像或图形子元素时,应该使用绝对定位布局

2.当C#代码中需要使用此区域内的子元素坐标位置时,应该使用绝对定位布局

  1. 边框(Border)

用于在某个元素周围绘制边框,或者为某元素提供背景

常用属性:

  • CornerRadius:获取或设置边框的圆角半径
  • BorderThickness:获取或设置边框的粗细
  • Padding:获取或设置Border与其包含的子对象之间的距离
  1. 停靠面板(DockPanel)

用于定义一个区域,并使该区域内的子元素在其上、下、左、右各边缘按水平或垂直方式依次停靠

常用属性:

  • LastChildFill:默认为true,表示最后一个子元素始终填满剩余的空间。如果将该属性设置为false,还必须为最后一个子元素显式指定停靠方向
  • ockPanel.Dock:子元素指定其在父元素中的停靠方式

8.3 常用基本控件

1、按钮(Button、RepeatButton)

Button:除了显示文字之外还可以显示图像或者同时显示图像和文字

RepeatButton:从按下按钮到释放按钮的时间段内会自动重复引发其Click事件

Delay属性:指定事件的开始时间 Interval属性:控制重复的间隔时间

2、文本块(TextBlock)和标签(Label)

TextBlock:显示可格式化表示的只读文本,可分别指定字体系列、样式、粗细或大小

Label:Label的内容模型是Content,因此可以包含其他对象

一般将Label与TextBox一起使用,用于显示描述性信息、验证信息或输入指示信息

3、文本框(TextBox、PasswordBox、RichTextBox)

TextBox:TextBox控件用于显示或编辑纯文本字符

Text:表示显示的文本;
MaxLength:限制用户输入的字符数;
AcceptsReturn: False(默认)、True(按回车键换行);
TextWrapping:控制是否自动转到下一行,当其值为“Wrap”时,该控件可自动扩展以容纳多行文本;
BorderBrush:边框颜色;
BorderThickness:边框宽度,如果不希望该控件显示边框,将其设置为0即可

PasswordBox:密码输入

PasswordChar属性:掩码,即不论输入什么字符,显示的都是用它指定的字符;
Password属性:获取或设置输入的密码字符串;
PasswordChanged事件:当密码字符串改变时发生

注意: PasswordBox应该用PasswordChanged事件,不能用
KeyDown、MouseDown或者MouseUp事件来判断

4、单选按钮(RadioButton)

从多个选项中选择一项,其内容模型是ContentControl,即它所包含的对象元素可以是任何类型(字符串、图像或面板等),但只能包含一个对象元素

GroupName属性:分组。同一组的多个RadioButton该属性应设置为同一个值;
IsChecked属性:是否选中某个单选按钮,被选中为true,否则为false

5、复选框(CheckBox)

同时选择多项或某一项的不同状态。 内容模型是ContentControl

Content属性:显示的文本;
IsChecked属性:true表示选中,false表示未选中,none表示不确定;
IsThreeState属性:如果支持3种状态,则为true;否则为false。默认值为false。如果该属性为true,可将IsChecked属性设置为null作为第3种状态;
Click事件:单击复选框时发生。利用该事件可判断是三种状态中的哪一种;
Checked事件:复选框选中时发生;
UnChecked事件:复选框未选中时发生

6、列表框(ListBox)和下拉框(ComboBox)

ListBox:用于显示一组选项,内容模型是Items,每个选项既可以是字符串,也可以是图像

ComboBox:是“TextBox+可弹出的ListBox”的组合,它除了比ListBox多了一个TextBox以外,对于每个选项的操作与ListBox的用法相同

常用属性

Count属性:获取列表项的个数;
SelectedIndex属性:获取当前选定项从0开始的索引号,未选择任何项时该值为−1;
SelectedItem属性:获取当前选定的项,未选择任何项时该值为null;
SelectionMode属性:选择列表项的方式

常用方法

Items.Add方法:向ListBox的项列表添加项;
Items.Clear方法:从集合中移除所有项;
Items.Contains方法:确定指定的项是否位于集合内;
Items.Remove方法:从集合中移除指定的对象;
SelectionChanged事件:当选择项发生改变时引发此事件

8.4 菜单、工具条和状态条

1、菜单(Menu)和快捷菜单(ContextMenu)

(1)Menu
可以显示在窗口的任何一个位置,但一般显示在窗口的顶部
(2)ContextMenu
除了是右键弹出菜单外,其他用法与Menu控件的用法相同
(3)这两个控件的菜单项都是通过MenuItem来实现的
a)MenuItem内还可以嵌套MenuItem,从而实现多级菜单
b)设置MenuItem的IsCheckable="true"可让其有勾选记号(默认false)
c)可以用InputGestureText设置快捷键,还可以通过Command设置系统命令(剪切、复制、粘贴等)

2、工具条(ToolBar、ToolBarTray)和状态条(StatusBar)

(1)ToolBar
一般显示在窗口上方,由多个Button、CheckBox、RadioButton、ComboBox等排列组成,通过这些项可以快速地执行程序提供的一些常用命令
(2)ToolBarTray
是ToolBar的容器,该容器内可放置多个ToolBar,并可以用鼠标拖动调整ToolBar在容器中的排列顺序
(3)StatusBar
一般显示窗口下方,以水平排列形式显示图像和状态信息

如果文章对您有所帮助,记得一键三连支持一下哦~~

你可能感兴趣的:(C#,学习笔记,c#,microsoft,开发语言,后端,前端)