欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > WPF布局控件

WPF布局控件

2025/2/22 16:57:33 来源:https://blog.csdn.net/qq_48148522/article/details/140025687  浏览:    关键词:WPF布局控件

目录

Grid

StackPanel

WrapPanel

DockPanel

UniformGrid

Canvas&InkCanvas

Canvas

InkCanvas

Border


Grid

属性

ShowGridLines:显示边线

ColumnDefinitions 列集合 表示有几列下面就写几个ColumnDefinition

Width 宽:如果写具体数字则表示具体的宽度

没有写具体的值的话 剩余宽度平均分配 会根据屏幕的大小自动分配

* 代表比例

auto 代表自动填充最大宽度

RowDefinitions 行集合 表示有几行下面就写几个RowDefinition

Height 高:如果写具体数字则表示具体的高度

没有写具体的值的话 剩余高度平均分配 会根据屏幕的大小自动分配

* 代表比列

auto 代表自动填充最大宽度

Grid.IsSharedSizeScope="True" 共享列宽

需要在最外层Grid打开这个设置,然后在下面需要共享列宽的列设置:SharedSizeGroup="A"

Group一样的共享。

在Grid中,其他的控件想要放几行几列 需要另外设置:

Grid.Column = "几列" Grid.Row="几行" 没有设置默认 0列 0行

合并单元格

Grid.ColumnSpan = "合并几行" Grid.RowSpan="合并几列"

这里不是指定哪一列,而是指定合并多少列

Grid使用技巧:

  1. Grid中可以嵌套Grid。
  2. 当Windwo下面只能有一个控件的时候Grid是最好的控件。
  3. 任何布局只要使用恰当,都可以用Grid布局出来。
<Grid Grid.IsSharedSizeScope="True"><Grid ShowGridLines="True" Visibility="Hidden"><Grid.ColumnDefinitions><ColumnDefinition Width="100"/><ColumnDefinition Width="auto"/><ColumnDefinition /><ColumnDefinition /></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition Height="100"/><RowDefinition /><RowDefinition /><RowDefinition /><RowDefinition /></Grid.RowDefinitions><Grid ShowGridLines="True" Grid.Row="2" Grid.Column="1" /><Button Grid.Column="2" Grid.Row="2" Grid.ColumnSpan="2"  Grid.RowSpan="2"/></Grid><Grid Height="30" ShowGridLines="True" VerticalAlignment="Top"><Grid.ColumnDefinitions><ColumnDefinition SharedSizeGroup="A" Width="100"/><ColumnDefinition /><ColumnDefinition /><ColumnDefinition /></Grid.ColumnDefinitions><GridSplitter HorizontalAlignment="Right" Width="5" Background="Red"/></Grid><Grid Height="200" ShowGridLines="True" VerticalAlignment="Bottom"><Grid.ColumnDefinitions><ColumnDefinition SharedSizeGroup="A"/><ColumnDefinition /><ColumnDefinition /><ColumnDefinition /></Grid.ColumnDefinitions></Grid>
</Grid>

StackPanel

默认 从下往往压榨的模式

属性

Orientation 改变压榨方向 如果内容有固定大小,就大小撑开,如果没有固定大小,就根据内容撑开

FlowDirection 读写习惯 左向右 或右向左

使用场景:图文并显、工具栏

可以用Grid代替

<StackPanel Orientation="Horizontal" FlowDirection="RightToLeft"><Button Content="Button1" /><Button Content="Button2" /><Button Content="Button3" />
</StackPanel>

WrapPanel

唯一一个不可以被Grid替代的布局控件,水平方向排列,过程中当前子项出界了,进行换行

属性

Orientation 调整排列方向 默认值为水平方向

如果是水平排列 最大高度为所在行的最大高度为定

如果是垂直排列 最大宽度为所在行的最大宽度为定

使用场景:电脑桌面式图标排列、浏览器搜索历史关键词排列信息

<WrapPanel Orientation="Horizontal"><Button Content="Button1" Width="100" Height="30" /><Button Content="Button1" Width="100" Height="30" /><Button Content="Button1" Width="100" Height="30" Margin="10" /><Button Content="Button1" Width="100" Height="30" /><Button Content="Button1" Width="100" Height="30" /><Button Content="Button1" Width="100" Height="40" /><Button Content="Button1" Width="100" Height="30" /><Button Content="Button1" Width="200" Height="30" />
</WrapPanel>

DockPanel

停靠控件

属性

LastChildFill 最后一个孩子 是否填充

DockPanel.Dock 附加给子项控件使用 设置Dock属性 上下左右 停靠在哪里

注意:先写显示哪个子项的,先占有位置,第二个只能在空余位置中设置

使用场景:应用的主窗口布局(标题栏 状态栏 工具栏 菜单栏)

<DockPanel LastChildFill="False"><Button Content="Button1" Width="100" DockPanel.Dock="Bottom"/><Button Content="Button3" DockPanel.Dock="Top"/><Button Content="Button2" DockPanel.Dock="Left"/><Button Content="Button4" Width="200" />
</DockPanel>

UniformGrid

均分 1*1 2*2 3*3 均分 等比分

属性

Columns 一共最多多少列 不存在指定列宽

Rows 一共最多多少行 不存在指定列高

如果只设置列 则内容行均分

如果只设置行 则内容列均分

如果行列都设置 则内容超出界面显示区域 但是也绘制

使用场景:9宫格的功能区域、图表(柱状图)

<UniformGrid Columns="3" Rows="3" Visibility="Collapsed"><Button Content="Button1"/><Button Content="Button2"/><Button Content="Button3"/><Button Content="Button4"/><Button Content="Button5"/><Button Content="Button6"/><Button Content="Button7"/><Button Content="Button8"/><Button Content="Button9"/>
</UniformGrid>

<UniformGrid Rows="1"><StackPanel Orientation="Vertical" VerticalAlignment="Bottom"><Border Height="150" Width="10" Background="Gray" VerticalAlignment="Bottom"/><Border Height="100" Width="10" Background="Orange" VerticalAlignment="Bottom"/></StackPanel><Border Height="150" Width="10" Background="Orange" VerticalAlignment="Bottom"/><Border Height="120" Width="10" Background="Orange" VerticalAlignment="Bottom"/><Border Height="100" Width="10" Background="Orange" VerticalAlignment="Bottom"/><Border Height="100" Width="10" Background="Orange" VerticalAlignment="Bottom"/><Border Height="200" Width="10" Background="Orange" VerticalAlignment="Bottom"/><Border Height="100" Width="10" Background="Orange" VerticalAlignment="Bottom"/><Border Height="100" Width="10" Background="Orange" VerticalAlignment="Bottom"/>
</UniformGrid>

Canvas&InkCanvas

Canvas

默认子控件坐标对齐左上角

属性

Canvas.Left 左边多少距离

Canvas.Top 上方多少距离

Canvas.Right 右边多少距离

Canvas.Bottom 下方多少距离

可以用Margin代替

如果上下左右都设置 优先级 左>右 上>下

使用场景:组态、组件分装(仪表指针)

<Canvas><Button Content="Button1" Canvas.Left="100" Canvas.Top="20"/><Button Content="Button2" Canvas.Right="120" Canvas.Bottom="20"/><Button Content="Button2" Margin="10"/>
</Canvas>

InkCanvas

笔迹 -- 可以当画板 获取笔迹

属性

EditingMode 编辑的模式

Ink 笔迹 画布 默认Ink

EraseByPoint 根据点删除

EraseByStroke 整条线删除

Select 选中 可以编辑

DefaultDrawingAttributes 设置线的颜色和宽度和高度

使用场景:画板、签字、电子黑板

<InkCanvas EditingMode="Ink" Name="inkCanvas"><InkCanvas.DefaultDrawingAttributes><DrawingAttributes Color="Red" Width="2" Height="2"/></InkCanvas.DefaultDrawingAttributes><Button Content="Button1" InkCanvas.Left="100" InkCanvas.Top="20" Click="Button_Click"/><Button Content="Button2" InkCanvas.Right="120" InkCanvas.Bottom="20" Click="Button_Click_1"/><Button Content="Button3" InkCanvas.Right="150" InkCanvas.Bottom="200" Click="Button_Click_2"/>
</InkCanvas>

Ink模式:

Select模式:

保存笔迹的做法:

private void Button_Click_4(object sender, RoutedEventArgs e)
{// 笔迹保存using FileStream fileStream = new FileStream("test.sk",FileMode.OpenOrCreate,FileAccess.ReadWrite);this.inkCanvas.Strokes.Save(fileStream,true);
}
private void Button_Click_5(object sender, RoutedEventArgs e)
{// 清除this.inkCanvas.Strokes.Clear();
}
private void Button_Click_6(object sender, RoutedEventArgs e)
{// 加载using FileStream fileStream = new FileStream("test.sk", FileMode.Open, FileAccess.Read);this.inkCanvas.Strokes.Add(new System.Windows.Ink.StrokeCollection(fileStream));
}

手写识别案例:

Ink ink = new Ink();
private void Button_Click(object sender, RoutedEventArgs e)
{// 识别库using RecognizerContext recognizerContext = new RecognizerContext();recognizerContext.Strokes = ink.CreateStrokes();recognizerContext.Strokes.Add(CombineStrokr());RecognitionResult result = recognizerContext.Recognize(out RecognitionStatus status);RecognitionAlternates als = result.GetAlternatesFromSelection();List<string> strs = new List<string>();for (int i = 0; i < als.Count; i++){strs.Add(als[i].ToString());}
}// Strokr 合并
private Stroke CombineStrokr()
{List<System.Drawing.Point> points = new List<System.Drawing.Point>();foreach (var item in this.inkCanvas.Strokes){// 将 StylusPoints 转换为 System.Drawing.Point points.AddRange(item.StylusPoints.Select(p => new System.Drawing.Point((int)p.X, (int)p.Y)).ToList());}return ink.CreateStroke(points.ToArray());
}
<!--手写文字识别Demo-->
<InkCanvas Name="inkCanvas" /><Button Content="识别" Click="Button_Click" VerticalAlignment="Bottom"/>

需要引用以下dll库: 可以在本合集置顶博客看我的代码路径,可以下载使用即可。

演示如下:

手写个A:

识别出来的为:

看代码反馈,也很难不看出,是NoError,证明识别成功。然后再strs中进行解析匹配像的值。

可以看出,识别效果还是很准确的,第一个就是想要的值。
微软官网也有Ink识别笔画和形状的案例:https://learn.microsoft.com/zh-cn/windows/apps/design/input/convert-ink-to-text

Border

装饰控件

Border内部只能放一个对象

使用场景:

需要背景的时候,或者需要特殊样式的时候

<Border CornerRadius="20" Width="200" Height="80"Background="Orange" BorderBrush="Red" BorderThickness="2"><Border.Clip><RectangleGeometry RadiusX="20" RadiusY="20" Rect="2 2 196 76" /></Border.Clip><Grid Background="Gray" />
</Border>

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词