WPF入门教程系列002-WPF布局
1.WPF窗体
WPF(Windows Presentation Foundation)窗体是一种用于创建图形用户界面的框架。它允许开发者使用XAML(可扩展标记语言)来描述窗口、控件和布局,从而实现丰富的交互效果。本文将从无边框窗体和异形窗体两个方面介绍WPF窗体。
1.1. 无边框窗体
无边框窗体是指在WPF窗体中不显示边框的窗口。要创建一个无边框窗体,可以使用Window
类的WindowStyle
属性,并将其设置为None
。以下是一个简单的无边框窗体示例:
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
WindowStyle="None">
<Grid>
<TextBlock Text="Hello, World!" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</Window>
在这个示例中,我们设置了WindowStyle
属性为None
,使得窗口没有边框。同时,我们还添加了一个TextBlock
控件,用于显示“Hello, World!”文本。
1.2. 异形窗体
异形窗体是指在WPF窗体中,窗口的形状不是矩形的。要创建一个异形窗体,可以使用Window
类的ResizeMode
属性,并将其设置为NoResize
或CanResizeWithSnap
。以下是一个简单的异形窗体示例:
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
ResizeMode="NoResize">
<Grid>
<TextBlock Text="Hello, World!" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</Window>
在这个示例中,我们设置了ResizeMode
属性为NoResize
,使得窗口不能调整大小。同时,我们还添加了一个TextBlock
控件,用于显示“Hello, World!”文本。
2.WPF布局
2.1.WPF的布局处理:
WPF 提供了多种布局方式来处理控件的位置和大小。这些布局方式可以基于坐标和大小进行调整,也可以使用流式布局。以下是常见的布局方式:
-
绝对布局(基于坐标和大小):可以使用 Canvas 控件来实现绝对布局。通过设置控件的
Canvas.Left
、Canvas.Top
、Canvas.Right
和Canvas.Bottom
属性,可以精确地指定控件在容器中的位置和大小。 -
相对布局:可以使用 Grid 控件来实现相对布局。通过定义行和列,并使用 Grid.Row 和 Grid.Column 属性,可以将控件放置在网格中的特定单元格位置。
-
堆叠布局:可以使用 StackPanel 控件来实现堆叠布局。StackPanel 可以水平或垂直地堆叠子控件,使它们按照一定顺序排列。
-
流式布局:可以使用 WrapPanel 或 FlowDocument 控件来实现流式布局。WrapPanel 可以自动换行,根据可用空间将子控件按行或列进行排列。FlowDocument 是用于处理大量文本内容的特殊布局控件,可以根据内容自动调整大小和换行。
2.2.布局原则:
在进行 WPF 布局时,可以遵循以下原则:
-
灵活性:WPF 布局系统是灵活的,可以自动适应不同的窗口大小和分辨率。使用相对布局和流式布局可以帮助实现灵活性。
-
可重用性:使用面向对象的思想,将布局逻辑进行封装和复用,以便在多个界面或应用程序中共享。
-
分离关注点:将布局与逻辑代码分离,使代码更易于维护和测试。使用 MVVM(Model-View-ViewModel)模式可以进一步分离布局和业务逻辑。
-
响应式设计:使用布局容器和控件的属性、样式和绑定来实现响应式设计,以便在运行时根据布局变化自动调整控件的位置和大小。
2.3.布局过程:
WPF 布局过程包括以下步骤:
- 测量(Measure):布局系统从上到下递归地测量每个控件的大小需求。控件的测量过程基于控件自身的属性、布局容器的约束条件以及控件的子元素。每个控件根据其内容和布局规则计算出所需的最小大小。
- 排列(Arrange):布局系统从上到下递归地安排每个控件的位置。在排列阶段,控件的实际大小和位置被确定,并根据父容器的布局规则进行调整。
- 渲染(Render):布局系统将排列后的控件发送给渲染引擎进行绘制。渲染引擎使用控件的外观和样式信息,将控件绘制到屏幕上。
3.布局控件
3.1 .Border控件
在日常布局中,Border控件常用于美化界面元素,例如,将一个按钮或文本框用边框装饰起来,增加视觉效果。同时,通过调整Border的CornerRadius属性,可以使边框具有圆角效果。若要在Border中显示多个子控件,可以将一个附加的Panel控件放置在父Border中,然后将子控件放置在该Panel控件中。
3.1.1.属性
- BorderBrush:用于设置边框的颜色。
- BorderThickness:用于设置边框的宽度。
- BorderPadding:用于设置边框的内部边距。
- CornerRadius:用于设置边框的圆角半径。
- Background:此属性设置Border用来绘制背景的Brush对象。
- Padding:指定Border内部内容与边框之间的空白区域。
- Margin:指定Border与其父元素之间的空白区域。
3.1.2.案例
- 创建边框和分隔线:通过设置Border的BorderBrush和BorderThickness属性,可以创建具有不同颜色和厚度的边框,用于分隔不同的区域或突出显示特定元素。
<Border BorderBrush="Black" BorderThickness="1">
<!-- 子元素内容 -->
</Border>
- 创建圆角边框:通过设置Border的CornerRadius属性,可以创建具有圆角边框的元素,给界面增加一些柔和和现代感。
<Border BorderBrush="Black" BorderThickness="1" CornerRadius="5">
<!-- 子元素内容 -->
</Border>
- 创建背景装饰:通过设置Border的Background属性,可以为元素提供背景色或背景图像,增加界面的美观性。
<Border Background="LightGray">
<!-- 子元素内容 -->
</Border>
下面是结合属性的几个案例:
- 创建一个有边框和背景颜色的按钮:
<Button Width="100" Height="30">
<Border BorderBrush="Black" BorderThickness="1" Background="LightBlue">
<TextBlock Text="Click me" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</Button>
- 创建一个圆角边框的图片显示框:
<Grid>
<Border BorderBrush="Black" BorderThickness="1" CornerRadius="10" Padding="5" Margin="10">
<Image Source="image.jpg" Stretch="UniformToFill"/>
</Border>
</Grid>
这些案例演示了如何使用Border控件的属性来创建不同的界面效果。你可以根据自己的需求调整属性值,以实现所需的布局和装饰效果。
3.2.DockPanel控件
DockPanel控件是WPF中常用的布局控件之一,它可以根据指定的方式将子元素停靠在容器的不同位置,如顶部、底部、左侧、右侧或中间。DockPanel提供了一种简单而灵活的方式来创建常见的界面布局。
3.2.1 .属性
- LastChildFill:指定是否将最后一个子元素填充剩余空间。当设置为True时,最后一个子元素将占据剩余的可用空间;当设置为False时,最后一个子元素将根据其自身大小进行布局,而不会填充剩余空间。
3.2.2.案例
- 布局控件停靠:通过设置子元素的DockPanel.Dock属性来指定子元素的停靠位置。可以将子元素停靠在顶部、底部、左侧、右侧或中间。
<DockPanel>
<Button Content="Top" DockPanel.Dock="Top"/>
<Button Content="Bottom" DockPanel.Dock="Bottom"/>
<Button Content="Left" DockPanel.Dock="Left"/>
<Button Content="Right" DockPanel.Dock="Right"/>
<Button Content="Center"/>
</DockPanel>
- 创建自适应布局:通过设置LastChildFill属性为True,可以使最后一个子元素填充剩余空间,实现自适应布局。
<DockPanel LastChildFill="True">
<Button Content="Top" DockPanel.Dock="Top"/>
<Button Content="Bottom" DockPanel.Dock="Bottom"/>
<Button Content="Left" DockPanel.Dock="Left"/>
<Button Content="Right" DockPanel.Dock="Right"/>
<Button Content="Center"/>
</DockPanel>
- 嵌套布局:DockPanel可以嵌套在其他布局控件内部,实现更复杂的布局结构。
<Grid>
<DockPanel>
<Button Content="Top" DockPanel.Dock="Top"/>
<Button Content="Bottom" DockPanel.Dock="Bottom"/>
<Button Content="Left" DockPanel.Dock="Left"/>
<Button Content="Right" DockPanel.Dock="Right"/>
<Button Content="Center"/>
</DockPanel>
</Grid>
以上是DockPanel控件的介绍和使用案例。通过设置子元素的DockPanel.Dock属性和调整LastChildFill属性,你可以灵活地创建各种布局效果,满足不同的界面设计需求。
3.3.StackPanel控件
StackPanel控件是WPF中常用的布局控件之一。它以堆叠的方式排列其子元素,可以将子元素水平或垂直地放置在一起。StackPanel提供了一种简单而有效的方式来创建线性布局。
3.3.1.属性
- Orientation:指定StackPanel中子元素的排列方向。可以设置为Horizontal(水平排列)或Vertical(垂直排列)。
- HorizontalAlignment和VerticalAlignment:指定StackPanel相对于其父元素的水平和垂直对齐方式。
- Margin:指定StackPanel与其父元素之间的空白区域。
- Background:指定StackPanel的背景颜色或背景图像。
- HorizontalContentAlignment和VerticalContentAlignment:指定StackPanel中子元素的水平和垂直内容对齐方式。
在日常布局中,StackPanel控件常用于以下方面:
3.3.2.案例
- 创建水平布局:通过将StackPanel的Orientation属性设置为Horizontal,可以将子元素水平排列在一行内。
<StackPanel Orientation="Horizontal">
<Button Content="Button 1"/>
<Button Content="Button 2"/>
<Button Content="Button 3"/>
</StackPanel>
- 创建垂直布局:通过将StackPanel的Orientation属性设置为Vertical,可以将子元素垂直排列在一列内。
<StackPanel Orientation="Vertical">
<Button Content="Button 1"/>
<Button Content="Button 2"/>
<Button Content="Button 3"/>
</StackPanel>
- 嵌套布局:StackPanel可以嵌套在其他布局控件内部,实现更复杂的布局结构。
<Grid>
<StackPanel Orientation="Vertical">
<Button Content="Button 1"/>
<StackPanel Orientation="Horizontal">
<Button Content="Button 2"/>
<Button Content="Button 3"/>
</StackPanel>
<Button Content="Button 4"/>
</StackPanel>
</Grid>
通过设置Orientation属性和嵌套StackPanel,并结合其他属性的调整,你可以灵活地创建各种线性布局效果,满足不同的界面设计需求。无论是水平排列还是垂直排列,StackPanel都能提供简单而有效的布局方式。
3.4.WrapPanel控件
WrapPanel控件是WPF中常用的布局控件之一,它提供了一种自动换行的布局方式。WrapPanel会按照从左到右、从上到下的顺序排列其子元素,并在达到容器边界时自动换行。
3.4.1.属性
- Orientation:指定WrapPanel的排列方向,可以是水平(默认值)或垂直。
- HorizontalAlignment:指定WrapPanel内部子元素在水平方向上的对齐方式。
- VerticalAlignment:指定WrapPanel内部子元素在垂直方向上的对齐方式。
- ItemWidth:指定WrapPanel内部子元素的固定宽度,用于控制每行的宽度。
- ItemHeight:指定WrapPanel内部子元素的固定高度,用于控制每列的高度。
- MinWidth:指定WrapPanel的最小宽度。
- MinHeight:指定WrapPanel的最小高度。
3.4.2.案例
案例一:流式布局
WrapPanel通过自动换行的方式,适应不同尺寸的容器,并使子元素按照预期顺序排列。这在需要动态布局的情况下非常有用,例如显示一系列标签或缩略图。
<!--这个案例中,我们创建了一个WrapPanel,并在其中放置了一系列按钮。WrapPanel会自动调整按钮的位置,使其按照从左到右、从上到下的顺序排列。每个按钮之间有5个像素的外边距。-->
<WrapPanel>
<Button Content="Button 1" Margin="5" />
<Button Content="Button 2" Margin="5" />
<Button Content="Button 3" Margin="5" />
<Button Content="Button 4" Margin="5" />
<Button Content="Button 5" Margin="5" />
</WrapPanel>
案例二:图片画廊
通过将图片放置在WrapPanel中,可以创建一个图片画廊效果。当窗口尺寸发生变化时,WrapPanel会自动调整行数和列数,以适应容器大小,并保持图片的纵横比。
<!--这个案例中,我们将一系列图片放置在WrapPanel中,设置图片的固定宽度和高度,并设置图片之间的外边距。当窗口尺寸发生变化时,WrapPanel会根据容器大小自动调整行数和列数,以适应窗口,并保持图片的纵横比。-->
<WrapPanel>
<Image Source="image1.jpg" Width="150" Height="100" Margin="5" />
<Image Source="image2.jpg" Width="150" Height="100" Margin="5" />
<Image Source="image3.jpg" Width="150" Height="100" Margin="5" />
<Image Source="image4.jpg" Width="150" Height="100" Margin="5" />
<Image Source="image5.jpg" Width="150" Height="100" Margin="5" />
</WrapPanel>
案例三:标签云
使用WrapPanel可以实现标签云的布局效果,其中每个标签作为WrapPanel的子元素,根据可用空间自动换行和调整位置。
<!--这个案例中,我们创建了一个标签云效果,使用WrapPanel作为容器,并在其中放置了一系列标签(Label)。每个标签具有相同的背景颜色(浅蓝色),并设置了外边距。WrapPanel会根据可用空间自动换行和调整位置,显示标签云的效果。-->
<WrapPanel>
<Label Content="Tag1" Background="LightBlue" Margin="5" />
<Label Content="Tag2" Background="LightBlue" Margin="5" />
<Label Content="Tag3" Background="LightBlue" Margin="5" />
<Label Content="Tag4" Background="LightBlue" Margin="5" />
<Label Content="Tag1" Background="LightBlue" Margin="5" />
<Label Content="Tag2" Background="LightBlue" Margin="5" />
<Label Content="Tag3" Background="LightBlue" Margin="5" />
<Label Content="Tag4" Background="LightBlue" Margin="5" />
<Label Content="Tag5" Background="LightBlue" Margin="5" />
<Label Content="Tag6" Background="LightBlue" Margin="5" />
<Label Content="Tag7" Background="LightBlue" Margin="5" />
</WrapPanel>
3.5.Grid控件
Grid控件是WPF中常用的布局控件之一,它提供了一个网格布局,可以将界面划分为行和列,并在每个单元格中放置控件或元素。
Grid控件的布局是基于行和列的定义,您可以在XAML中指定行和列的数量、大小、对齐方式等属性。每个控件或元素可以跨越多个行和列,以实现复杂的布局。
3.5.1.属性
- RowDefinitions:定义Grid的行,可以指定行的数量、高度、对齐方式等。
- ColumnDefinitions:定义Grid的列,可以指定列的数量、宽度、对齐方式等。
- Grid.Row:指定控件或元素所在的行索引。
- Grid.Column:指定控件或元素所在的列索引。
- Grid.RowSpan:指定控件或元素跨越的行数。
- Grid.ColumnSpan:指定控件或元素跨越的列数。
- HorizontalAlignment:指定控件或元素在单元格中的水平对齐方式。
- VerticalAlignment:指定控件或元素在单元格中的垂直对齐方式。
3.5.2.案例
案例一:简单网格布局
Grid控件提供了一种灵活的网格布局方式,可以将界面划分为行和列,并在每个单元格中放置控件或元素。这使得我们可以以自由的方式创建复杂的布局结构。
<!--这个案例中,我们创建了一个简单的网格布局,其中包含两行和两列。第一行和第一列的大小根据内容自动调整,而第二行和第二列的大小会根据剩余空间进行伸缩。我们在每个单元格中放置了一个文本块(TextBlock)和一个文本框(TextBox)。-->
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="姓名:" />
<TextBox Grid.Row="0" Grid.Column="1" />
<TextBlock Grid.Row="1" Grid.Column="0" Text="地址:" />
<TextBox Grid.Row="1" Grid.Column="1" />
</Grid>
案例二:表格布局
通过使用Grid控件,可以实现表格布局的效果,将数据以行和列的形式显示。每个单元格可以放置文本、图像或其他控件,使得数据呈现更加清晰和整齐。
<!--这个案例中,我们使用Grid控件创建了一个简单的表格布局。其中,第一行定义了表头,显示了"ID"、"姓名"和"年龄"三列的标题。接下来的两行显示了具体的数据,每个单元格都是一个文本块(TextBlock)。。-->
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="ID" />
<TextBlock Grid.Row="0" Grid.Column="1" Text="姓名" />
<TextBlock Grid.Row="0" Grid.Column="2" Text="年龄" />
<TextBlock Grid.Row="1" Grid.Column="0" Text="1" />
<TextBlock Grid.Row="1" Grid.Column="1" Text="John" />
<TextBlock Grid.Row="1" Grid.Column="2" Text="25" />
<TextBlock Grid.Row="2" Grid.Column="0" Text="2" />
<TextBlock Grid.Row="2" Grid.Column="1" Text="Jane" />
<TextBlock Grid.Row="2" Grid.Column="2" Text="30" />
</Grid>
案例三:响应式布局
Grid控件允许我们使用行和列的定义来自适应不同的屏幕尺寸和分辨率。我们可以通过设置行和列的大小、比例和对齐方式,使布局在不同设备上具有良好的可读性和可用性。
<!--这个案例中,我们创建了一个响应式布局,其中内容区域占据了整个可用空间。无论窗口尺寸如何变化,内容区域都会自动填充剩余空间。提交按钮则位于网格的右下角。-->
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="内容区域" />
<Button Grid.Row="1" Grid.Column="1" Content="提交" />
</Grid>
3.6.UniformGrid控件
UniformGrid控件是WPF中的一种特殊网格布局控件,它提供了一种均匀分布子元素的布局方式。与普通的Grid控件不同,UniformGrid控件会自动将子元素均匀地分布在行和列中,使它们具有相同的大小。
UniformGrid控件的布局是基于行和列的定义,您可以在XAML中指定行和列的数量。与Grid控件不同的是,UniformGrid控件会自动调整子元素的大小以适应每个单元格的大小,从而实现均匀分布的效果。
3.6.1.属性
- Rows:指定UniformGrid控件的行数。
- Columns:指定UniformGrid控件的列数。
- HorizontalAlignment:指定子元素在单元格中的水平对齐方式。
- VerticalAlignment:指定子元素在单元格中的垂直对齐方式。
3.6.2.案例
下面是一个简单的示例,演示了UniformGrid控件的使用:
<!--在这个示例中,UniformGrid控件被用来创建一个2行3列的布局。在每个单元格中,我们放置了一个按钮(Button)元素。UniformGrid控件会自动将这些按钮均匀地分布在2行3列的布局中,使它们具有相同的大小和间距。-->
<UniformGrid Rows="2" Columns="3">
<Button Content="按钮1" />
<Button Content="按钮2" />
<Button Content="按钮3" />
<Button Content="按钮4" />
<Button Content="按钮5" />
<Button Content="按钮6" />
</UniformGrid>
好的,让我重新回答您关于Canvas控件的问题。
3.7.Canvas控件
Canvas控件是WPF中常用的布局控件之一,它提供了自由定位的布局方式,允许您在其中放置控件或元素,并通过指定它们的位置和大小来精确控制它们的布局。
3.7.1.属性
Canvas控件具有以下常用属性:
- Background:用于设置Canvas的背景颜色。
- ClipToBounds:指定是否裁剪超出Canvas边界的子元素。
- IsItemsHost:指定是否作为ItemsControl的主机。
- AllowDrop:指定是否允许从其他控件拖放元素到Canvas上。
- Children:用于访问Canvas中的子元素集合。
此外,Canvas控件还提供了一些用于定位子元素的特定属性:
- Canvas.Left:指定子元素相对于Canvas左侧的位置。
- Canvas.Top:指定子元素相对于Canvas顶部的位置。
- Canvas.Right:指定子元素相对于Canvas右侧的位置。
- Canvas.Bottom:指定子元素相对于Canvas底部的位置。
3.7.2.案例
案例一:自由定位按钮
Canvas控件允许您通过设置子元素的位置属性来自由定位它们。在下面的示例中,我们创建了一个Canvas控件,并将两个按钮放置在其中,分别位于指定的位置。
<Canvas>
<Button Content="按钮1" Canvas.Left="100" Canvas.Top="50" />
<Button Content="按钮2" Canvas.Left="200" Canvas.Top="100" />
</Canvas>
案例二:动态绘制图形
Canvas控件常用于动态绘制图形,您可以使用画布上的绘图工具(如Path、Rectangle等)创建形状,并通过设置其位置和尺寸属性来控制绘制的图形。
<Canvas>
<Rectangle Canvas.Left="50" Canvas.Top="50" Width="100" Height="50" Fill="Red" />
<Ellipse Canvas.Left="150" Canvas.Top="150" Width="80" Height="80" Fill="Blue" />
</Canvas>
案例三:拖放操作
Canvas控件可以与拖放操作结合使用,允许您从其他控件拖动元素到Canvas上,并在Canvas中放置它们。以下是一个简单的示例,演示了将文本框从StackPanel拖放到Canvas上的操作。
<StackPanel>
<TextBox Text="可拖动的文本框" PreviewMouseLeftButtonDown="TextBox_PreviewMouseLeftButtonDown" />
</StackPanel>
<Canvas AllowDrop="True" Drop="Canvas_Drop">
<!--这里可以放置拖放后的元素-->
</Canvas>
private void TextBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
TextBox textBox = (TextBox)sender;
DragDrop.DoDragDrop(textBox, textBox.Text, DragDropEffects.Move);
}
private void Canvas_Drop(object sender, DragEventArgs e)
{
string text = (string)e.Data.GetData(DataFormats.StringFormat);
TextBox textBox = new TextBox { Text = text };
Canvas canvas = (Canvas)sender;
canvas.Children.Add(textBox);
Canvas.SetLeft(textBox, e.GetPosition(canvas).X);
Canvas.SetTop(textBox, e.GetPosition(canvas).Y);
}
好的,以下是关于InkCanvas控件的介绍:
3.8.InkCanvas控件
InkCanvas控件是WPF中用于绘制和捕捉手写笔迹的控件。它提供了一个可以自由绘制的画布,并支持使用数字笔或触摸设备进行手写输入。InkCanvas控件是创建手写笔迹、签名、绘图应用程序等的理想选择。
3.8.1.属性
- Background:用于设置InkCanvas的背景颜色。
- DefaultDrawingAttributes:指定默认的绘制属性,如笔刷颜色、粗细等。
- Strokes:用于访问InkCanvas中的笔迹集合。
- EditingMode:指定InkCanvas的编辑模式,如绘制、擦除等。
- EraserShape:指定橡皮擦的形状,如圆形、矩形等。
3.8.2.案例
案例一:绘制手写笔迹
通过InkCanvas控件,您可以捕捉用户的手写笔迹。下面的示例展示了如何创建一个简单的InkCanvas,并允许用户在其中绘制。
<InkCanvas />
案例二:设置默认绘制属性
您可以通过DefaultDrawingAttributes属性设置默认的绘制属性,如笔刷颜色、粗细等。以下示例将InkCanvas的默认绘制属性设置为红色笔刷和较粗的笔宽。
<InkCanvas>
<InkCanvas.DefaultDrawingAttributes>
<DrawingAttributes Color="Red" Width="5" />
</InkCanvas.DefaultDrawingAttributes>
</InkCanvas>
案例三:擦除手写笔迹
InkCanvas控件支持擦除手写笔迹。您可以将EditingMode属性设置为EraseByPoint或EraseByStroke来启用擦除功能。以下示例演示了如何在InkCanvas中启用擦除功能。
<InkCanvas EditingMode="EraseByPoint" />