WPF:WPF原生布局说明

前言

WPF在国内讨论度很小,我在这里记录一下WPF简单的原生控件是如何使用的,顺便回忆一下WPF的基础知识,有些忘记的比较厉害了

WPF简介

WPF是微软推出的桌面UI软件,是我觉得最早实现MVVM(数据驱动事务),比Vue早3,4年吧。当然讨论谁是第一个并没有意义,现在Vue如日中天,Vue+uniapp(uniapp是基于Vue开发的)基本实现了网页端到移动端全平台的UI解决方案。而桌面软件逐渐式微。注意,WPF只能在Windows环境下运行,Linux系统现在应该暂不支持

WPF目前状况

微软技术的特点就是,技术很牛B,但是容易断档。只管开发新技术,但是不管维护。WPF目前框架已经停止更新,微软现在主推的是MAUI,推出Windows桌面应用,Andorid,ios,macos跨端文件,一次生成,多端使用。WPF现在是工控领域比较多,工控领域主打的就是性能。

现在Ui框架情况

  • Vue:
    • Vue2.0:上手难度低,开发速度快
    • Vue3.0:效率更高,
    • uniapp(基于Vue开发):在追求开发效率上和学习成本上,是国内目前的最优解
  • React:用的比较少,不评价。Web端两个大哥:Vue和React。React 有 React Active,也支持移动端开发。但是我也没接触过。
  • Angular:目前看已经没落了
  • Flutter:没用过,是Andriod和IOS跨端开发的框架,但是好像圈子比较小
  • QT:C++,专业工控领域,因为是C++所以可以实现对内存的完全操控,但是开发周期长,开发难度大。用来开发小项目就是大炮打蚊子。
  • C#/.NET
    • Winform:老东西,死而不僵。在工控领域,不追求UI界面美观,只要求能用。现在岗位也还是很多。
    • WPF:Winform的上位替代,使用XMAL,MVVM。用起来和Vue差不多。
    • Unity2d/3d:上限最高的Ui框架,用游戏的UI去做操作系统简直是降维打击。特别适合需要进行交互设计的软件。但是问题是大部分UI界面就是点点点,有点大材小用。

工控领域是特别讲究性能的地方。网页不太适合做工控领域的操作软件。工控领域的要求是:

  • 效率高:因为工控领域机器性能比较差,打开网页特别慢。
  • 兼容性好:有些工控机还是windows xp系统这种老东西。
  • 权限问题:网页的权限提升难度比较大。

ok,目前有些离题了,现在来介绍WPF原生相关知识

WPF原生介绍

微软官方文档
微软的文档写的真是垃圾在这里插入图片描述,我去微软上面搜WPF文档里面没有,给放到Windows Desktop里面了。我找了半天。还有就是有部分是机器翻译,你TM把元素名翻译了我怎么搜得到。Grid翻译成网格,我搜还没有这个类。
在这里插入图片描述

WPF布局

布局是最重要,因为后面单个元素组件我们可以通过Ui库来进行解决。

名称作用
Grid最基本的布局元素。通过Row和Col来对布局进行划分。有固定长度,比例长度,自动适应三种长度布局
UniformGrid均分布局。如果是9个按钮,就是33。如果是4个按钮,就是22。如果不是平方数,例如10个按钮,则是4*4的布局,然后是4+4+2。剩下的布局为空。
StackPanel无法自动换行的布局
WrapPanel会自动换行的布局
DockPanel停靠容器,类似于vs studio里面的侧边栏

Grid

Grid使用有一定的逻辑顺序

  • Grid
    • Gird.RowDefinitions:定义用于包裹RowDefinition
      • RowDefinition:定义有多少个RowDefinition
    • Grid.ColumnDefinitions:同上
      • ColumnDefinition
    • 元素

示例如下:

<Window x:Class="ModuleB.Views.ViewB"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ModuleB.Views"
        mc:Ignorable="d"
        Title="ViewB" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>


        <TextBlock Text="我是默认"
                   FontSize="50" />
        <TextBlock Text="我是第二个默认" TextWrapping="Wrap"
                   FontSize="50" />
        <TextBlock Text="我是默认"
                   FontSize="50" />
        <TextBlock Text="我是指定第二行第二列"
                   FontSize="50"
                   Grid.Row="2"
                   Grid.Column="2"
                   TextWrapping="Wrap" />

    </Grid>
</Window>

不指定的话,就默认第一格,这里可以看到两个文字重叠了

在这里插入图片描述

按比例修改

<Window x:Class="ModuleB.Views.ViewB"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ModuleB.Views"
        mc:Ignorable="d"
        Title="ViewB" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="1*"/>
            <RowDefinition Height="1*"/>
            <RowDefinition Height="2*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="2*"/>
        </Grid.ColumnDefinitions>
		............

    </Grid>
</Window>

在这里插入图片描述

固定大小

<Window x:Class="ModuleB.Views.ViewB"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ModuleB.Views"
        mc:Ignorable="d"
        Title="ViewB" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="200"/>
            <RowDefinition Height="100"/>
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="200"/>
            <ColumnDefinition Width="100"/>
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        .......

    </Grid>
</Window>

在这里插入图片描述

UniformGrid

自动分配,尽可能均匀分布,与长宽不管。例如4=2x2。9=3x3。如果是不能开方的就会向上取整,缺的就空着。例如8=3*3-1。
效果如下

4个

<Window x:Class="ModuleB.Views.ViewB"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ModuleB.Views"
        mc:Ignorable="d"
        Title="ViewB" Height="450" Width="800">
    <UniformGrid>
        <TextBox  Text="1" FontSize="50"/>
        <TextBox  Text="2"
                  FontSize="50" />
        <TextBox  Text="3"
                  FontSize="50" />
        <TextBox  Text="4"
                  FontSize="50" />
    </UniformGrid>
</Window>

在这里插入图片描述
9个

<Window x:Class="ModuleB.Views.ViewB"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ModuleB.Views"
        mc:Ignorable="d"
        Title="ViewB" Height="450" Width="800">
    <UniformGrid>
        <TextBox  Text="1" FontSize="50"/>
        <TextBox  Text="2"
                  FontSize="50" />
        <TextBox  Text="3"
                  FontSize="50" />
        <TextBox  Text="4"
                  FontSize="50" />
        <TextBox  Text="5"
                  FontSize="50" />
        <TextBox  Text="6"
                  FontSize="50" />
        <TextBox  Text="7"
                  FontSize="50" />
        <TextBox  Text="8"
                  FontSize="50" />
        <TextBox  Text="9"
                  FontSize="50" />
    </UniformGrid>
</Window>

在这里插入图片描述
8个

<Window x:Class="ModuleB.Views.ViewB"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ModuleB.Views"
        mc:Ignorable="d"
        Title="ViewB" Height="450" Width="800">
    <UniformGrid>
        <TextBox  Text="1" FontSize="50"/>
        <TextBox  Text="2"
                  FontSize="50" />
        <TextBox  Text="3"
                  FontSize="50" />
        <TextBox  Text="4"
                  FontSize="50" />
        <TextBox  Text="5"
                  FontSize="50" />
        <TextBox  Text="6"
                  FontSize="50" />
        <TextBox  Text="7"
                  FontSize="50" />
        <TextBox  Text="8"
                  FontSize="50" />
    </UniformGrid>
</Window>


在这里插入图片描述

StackPanel

单方向布局,配合Orientation 使用,默认纵向布局.长宽会自动拉伸填满

<Window x:Class="ModuleB.Views.ViewB"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ModuleB.Views"
        mc:Ignorable="d"
        Title="ViewB"
        Height="450"
        Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <StackPanel Orientation="Horizontal">
            <Button Content="按钮"
                    FontSize="50" />
            <Button Content="按钮"
                    FontSize="50" />
            <Button Content="按钮"
                    FontSize="50" />
            <Button Content="按钮"
                    FontSize="50" />
            <Button Content="按钮"
                    FontSize="50" />
            
        </StackPanel>
        <StackPanel Grid.Column="1">
            <Button Content="按钮"
                    FontSize="50" />
            <Button Content="按钮"
                    FontSize="50" />
            <Button Content="按钮"
                    FontSize="50" />
            <Button Content="按钮"
                    FontSize="50" />
            <Button Content="按钮"
                    FontSize="50" />
        </StackPanel>
    </Grid>
    
</Window>

在这里插入图片描述

WrapPanel

自动换行布局,也可以指定排版方向

<Window x:Class="ModuleB.Views.ViewB"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ModuleB.Views"
        mc:Ignorable="d"
        Title="ViewB" Height="450" Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>

        <WrapPanel>
            <Button Content="按钮"
                    FontSize="50" />
            <Button Content="按钮"
                    FontSize="50" />
            <Button Content="按钮"
                    FontSize="50" />
            <Button Content="按钮"
                    FontSize="50" />
            <Button Content="按钮"
                    FontSize="50" />
            <Button Content="按钮"
                    FontSize="50" />
            <Button Content="按钮"
                    FontSize="50" />
            <Button Content="按钮"
                    FontSize="50" />
            <Button Content="按钮"
                    FontSize="50" />
        </WrapPanel>
        <WrapPanel Orientation="Vertical" Grid.Column="1">
            <Button Content="按钮"
                    FontSize="50" />
            <Button Content="按钮"
                    FontSize="50" />
            <Button Content="按钮"
                    FontSize="50" />
            <Button Content="按钮"
                    FontSize="50" />
            <Button Content="按钮"
                    FontSize="50" />
            <Button Content="按钮"
                    FontSize="50" />
            <Button Content="按钮"
                    FontSize="50" />
            <Button Content="按钮"
                    FontSize="50" />
            <Button Content="按钮"
                    FontSize="50" />
        </WrapPanel>
    </Grid>
</Window>

在这里插入图片描述

DockPanel

停靠布局,使用DockPanel.Dock指定停靠方向

默认设置

<Window x:Class="ModuleB.Views.ViewB"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ModuleB.Views"
        mc:Ignorable="d"
        Title="ViewB"
        Height="450"
        Width="800">
    <DockPanel >
        <Button DockPanel.Dock="Top"
                Content=" Top" FontSize="50"/>
        <Button DockPanel.Dock="Left"
                Content="Left"
                FontSize="50" />
        <Button DockPanel.Dock="Right"
                Content=" Right"
                FontSize="50" />
        <Button DockPanel.Dock="Bottom"
                Content=" Bottom"
                FontSize="50" />
        <Button Content=" Center"
                FontSize="50" />

    </DockPanel>
    
</Window>

在这里插入图片描述
放置顺序会影响覆盖逻辑

<Window x:Class="ModuleB.Views.ViewB"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ModuleB.Views"
        mc:Ignorable="d"
        Title="ViewB"
        Height="450"
        Width="800">
    <DockPanel >
        <Button DockPanel.Dock="Bottom"
                Content=" Bottom"
                FontSize="50" />
        <Button DockPanel.Dock="Left"
                Content="Left"
                FontSize="50" />
        <Button DockPanel.Dock="Top"
                Content=" Top" FontSize="50"/>
        
        <Button DockPanel.Dock="Right"
                Content=" Right"
                FontSize="50" />
      
        <Button Content=" Center"
                FontSize="50" />

    </DockPanel>
    
</Window>

在这里插入图片描述
最后一个元素不填满布局

<Window x:Class="ModuleB.Views.ViewB"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ModuleB.Views"
        mc:Ignorable="d"
        Title="ViewB"
        Height="450"
        Width="800">
    <DockPanel  LastChildFill="False">
        <Button DockPanel.Dock="Top"
                Content=" Top" FontSize="50" />
        <Button DockPanel.Dock="Left"
                Content="Left"
                FontSize="50" />
        <Button DockPanel.Dock="Right"
                Content=" Right"
                FontSize="50" />
        <Button DockPanel.Dock="Bottom"
                Content=" Bottom"
                FontSize="50" />
        <Button Content=" Center"
                FontSize="50" />

    </DockPanel>
    
</Window>

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF(Windows Presentation Foundation)和WinForms (Windows Forms)是微软的两种用于构建 Windows 桌面应用程序的技术。它们都有各自的优点和缺点。 WPF的优点: 1. 强大的可视化和布局功能:WPF 使用 XAML(可扩展应用程序标记语言)来定义用户界面,可以轻松创建复杂的布局和交互效果。 2. 数据绑定和MVVM支持:WPF 提供了强大的数据绑定机制,可以将数据与界面元素实时同步。同时,使用MVVM(Model-View-ViewModel)设计模式可以更好地解耦和管理应用程序的逻辑。 3. 分辨率无关性:WPF 应用程序可以根据不同的屏幕分辨率进行自适应,确保在不同的设备上都能提供良好的用户体验。 4. 动画和图形效果:WPF 提供了丰富的动画和图形效果,可以使应用程序更加生动和吸引人。 WPF的缺点: 1. 学习曲线较陡峭:相对于WinForms,WPF 的学习曲线要更陡峭一些,因为它引入了许多新的概念和技术。 2. 较高的系统要求:由于WPF 依赖于.NET Framework,并且使用图形硬件加速,因此对计算机的要求较高,较低配置的设备可能会运行缓慢。 3. 兼容性问题:WPF 只能在 Windows 系统上运行,对于跨平台需求的应用程序来说不是一个理想的选择。 WinForms的优点: 1. 简单易学:WinForms 使用传统的事件驱动编程模型,对于有经验的开发人员来说比较容易上手。 2. 良好的兼容性:WinForms 应用程序可以在各个版本的 Windows 上运行,并且不需要依赖额外的框架。 3. 轻量级:由于WinForms 是直接基于原生Windows控件的技术,因此在性能上比WPF更加轻量级。 WinForms的缺点: 1. 界面布局限制:WinForms 的界面布局功能相对较弱,无法轻松实现复杂的布局和动画效果。 2. 缺乏现代化特性:相比WPF,WinForms 在视觉效果和用户体验方面有所欠缺,无法提供现代化的应用程序体验。 3. 无法很好地支持跨平台开发:由于WinForms 只能在 Windows 上运行,对于跨平台开发需求不是一个理想的选择。 综上所述,选择WPF还是WinForms取决于具体的应用需求和开发团队的技术背景。如果需要构建复杂的、具有现代化特性的应用程序,并且开发团队有足够的技术能力,那么选择WPF可能更为合适。如果需要快速开发简单的桌面应用程序,并且对界面布局和跨平台支持要求不高,那么WinForms可能是一个更好的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值