首页 > 其他分享 >WPF的前世今生

WPF的前世今生

时间:2023-08-11 15:57:11浏览次数:49  
标签:文件 今生 Xaml 前世 Student using WPF View

1、WPF的布局
WPF的布局分为相对定位和绝对定位两种。
绝对定位一般用Canvas
相对定位一般用Grid、StackPanel、DockPanel、WrapPanel

2、MVVM模式是什么
MVVM就是Model View ViewModel
Model层就是数据层,你可以把它理解成实体层,一般情况下,只要不和服务端挂钩或者小型项目,写一个实体类就行了,和服务端挂钩,或者大型项目加入了DTO,小项目返回原生对象就行了,它此时是有状态的,要和数据库挂钩,比如你用到SqlSugar,你这个实体类就不能单独的继承BindableBase了
View就是视图,你写的Xaml文件用来展示前端界面的,还有就是你对绑定、事件的声明
ViewModel层就是业务处理的,用来处理你前面View的所有声明,通常也会监听View层,比如ViewModel层更新,View层更新
优点就是降低代码耦合,提高重用性
3、Xaml文件
一般情况下,你可以使用Xaml文件来写WPF的前端页面(但是不一定,后文提到)
Xaml文件,你可以理解为Xml文件的扩展,
通常,我们Xml文件是这样书写的

<object>
  <Animal>
    <Cat></Cat>
  </Animal>
</object>

在Xaml文件中格式也是一样的。

<Window
    x:Class="WPFSample.Views.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:custom="clr-namespace:WPFSample.Controls"
    xmlns:views="clr-namespace:WPFSample.Views"
    Title="How to create a WPF"
    Width="500"
    Height="500">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
    </Grid>
</Window>

在我们普通的书写代码中,不管是java还是C#,或者是Python,
他们的.cs、.java 、.py文件上方是
using xxx;
import xxx;
这个using和import就在Xaml文件中使用xmlns表示。

我在写详细一点
你的MainViewModel要应用一个Student类
那么你可以这样书写
using WPFSample; using WPFSample.Student; public class MainViewModel { private Student Stus{get;set;} }

using WPFSample;
using WPFSample.Student;
public class MainViewModel
{
    private Student Stus{get;set;}
}

那么在Xaml文件中你可以这样做

<Window x:class="WPFSample"
        xmlns:stu="WPFSample.Student">
    
</Window>

stu是随便取得名字,方便在下面使用
现在我们来编写一个简单的页面
如果你了解Html或者一点Vue,那么你就能更好的理解了,不了解没关系,我可以详细的为你解答
1、你首先使用VS创建一个WPF的程序,并且你运行了它,它打开后是一个弹窗,差不多和一个QQ的登录界面一样大小。
2、你可以写一个Button控件,并且描述了它的长宽,以及它的内容

<Button Width="200" Height="25" Content="按钮"/>

3、运行代码,你可以发现,弹窗中有了按钮
4、现在你想复刻QQ的界面
你这样写了

<TextBlick Text="登录"/>
<TextBox Width="200"/>
<Button Width="80"/>

你发现错落有致,没有达到你想要的效果
那么,就要用到WPF的布局了

<Grid Margin="100,50,100,50">
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
            <TextBlock
                HorizontalAlignment="Center"
                VerticalAlignment="Center"
                FontSize="30"
                Text="{Binding appData.SystemName}" />

            <StackPanel Grid.Row="1" Orientation="Horizontal">
                <TextBlock
                    Width="60"
                    Margin="50,0,0,0"
                    VerticalAlignment="Center"
                    FontSize="18"
                    Text="用户名:" />
                <TextBox
                    Width="200"
                    Margin="10,0,0,0"
                    VerticalAlignment="Center"
                    mah:TextBoxHelper.Watermark="请输入用户名"
                    mah:TextBoxHelper.ClearTextButton="True"
                    Text="{Binding appData.CurrentUser.Name}" />
            </StackPanel>

            <StackPanel Grid.Row="2" Orientation="Horizontal">
                <TextBlock
                    Width="60"
                    Margin="50,0,0,0"
                    VerticalAlignment="Center"
                    FontSize="18"
                    Text="密码:" />
                <PasswordBox
                    Width="200"
                    Margin="10,0,0,0"
                    VerticalAlignment="Center"
                    mah:TextBoxHelper.ClearTextButton="True"
                    mah:TextBoxHelper.Watermark="请输入密码"
                     converter:PasswordBoxHelper.Attach="True"
                    converter:PasswordBoxHelper.Password="{Binding appData.CurrentUser.Password,Mode=TwoWay}" />
                
                <!--<TextBox
                    Width="200"
                    Margin="10,0,0,0"
                    VerticalAlignment="Center"
                    Text="{Binding appData.CurrentUser.Password}" />-->
            </StackPanel>

            <StackPanel
                Grid.Row="3"
                Margin="40,0,0,0"
                HorizontalAlignment="Center"
                VerticalAlignment="Center"
                Orientation="Horizontal">
                <Button
                    Width="80"
                    Command="{Binding LoginCommand}"
                    CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=mah:MetroWindow}}"
                    Content="登录"
                    IsDefault="True" />
                <Button
                    Width="80"
                    Margin="40,0,0,0"
                    Command="{Binding CancelCommand}"
                    Content="取消"
                    IsCancel="True" />
            </StackPanel>
</Grid>

我现在讲解一下,这段简单的代码,你把Grid当作一个框,一间房,
你知道Row是英文行、排的意思,那么

              <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>

这段代码就是把你刚才打开的弹窗分成了4层
程序中是从0开始的,不是1,
所以你的第一行写了TextBlock。

标签:文件,今生,Xaml,前世,Student,using,WPF,View
From: https://www.cnblogs.com/guchen33/p/17433580.html

相关文章

  • WPF图形控件使用之-VisualBrush图形画刷
    VisualBrush 背景图 Background上画,线条(LineGeometry)、几何图形(RectangleGeometry)、椭圆(EllipseGeometry)、弧线(ArcSegment )、各种控件等,相对与DrawingBrush书写更简单一些。 属性说明备注Viewport(从左向右,从上向下,图像宽度放大比例,图像高度放大比例)放大背......
  • WPF实现类似ChatGPT的逐字打印效果
    背景前一段时间ChatGPT类的应用十分火爆,这类应用在回答用户的问题时逐字打印输出,像极了真人打字回复消息。出于对这个效果的兴趣,决定用WPF模拟这个效果。真实的ChatGPT逐字输出效果涉及其语言生成模型原理以及服务端与前端通信机制,本文不做过多阐述,重点是如何用WPF模拟这个效果......
  • WPF实现跳动的字符效果
    本文将介绍一个好玩但实际作用可能不太大的动画效果:跳动的字符。为了提高动画效果的可重用性以及调用的灵活性,通过Behavior实现跳动的字符动画。先看下效果:技术要点与实现通过TextEffect的PositionStart和PositionCount属性控制应用动画效果的子字符串的起始位置以及长度,同时使......
  • 界面控件DevExpress WPF Chart组件——拥有超快的数据可视化库!
    DevExpressWPF Chart组件拥有超大的可视化数据集,并提供交互式仪表板与高性能WPF图表库。DevExpressCharts提供了全面的2D/3D图形集合,包括数十个UI定制和数据分析/数据挖掘选项。PS:DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。......
  • 解决winform调用wpf窗体时原窗体缩小的问题
    在使用winform调用wpf窗体时,原来的winform窗体会缩小,同时分辨率会发生变化,用如下方法来解决这个问题。首先找到winform项目中的Properties ==>AssemblyInfo.cs,打开该文件,在末尾加入如下代码,之后重新运行即可。[assembly:System.Windows.Media.DisableDpiAwareness]//禁用WPF......
  • WPF自定义TreeView滚动条样式
     根据客户需求,要在TreeView目录树上显示10万+个节点,但是目录树显示10万加节点后,整个页面操作起来非常卡,所以给目录树增加了虚拟化设置。但是虚拟化设置一直没生效,后来经过排查发现是使用的自定义滚动条导致了虚拟化设置没有生效,后来自己写了一个滚动条样式,问题解决了。目录树虚......
  • WPF 密码提示框
    首先展示效果 如图密码提示框,可通过小眼睛进行显示和隐藏密码1、自定义控件publicclassTitlePasswordBox:TextBox{///<summary>///密码提示框提示语///</summary>publicstringTitle{get{return(strin......
  • WPF c# 使用Emit自动创建通知类
    参考概念参考自https://www.codewrecks.com/post/old/2008/08/implement-inotifypropertychanged-with-dynamic-code-generation/和DevExpress的MVVM框架Runtime-generatedPOCOViewModels代码实现来自ChatGPT抽卡原始类publicclassClass1{publicvirtualint......
  • 你们眼睛干涩,胀痛吗?C# WPF 久坐提醒桌面小程序
    目录说明设置提醒时间,及休息时间久坐提醒倒计时休息提醒倒计时休息到计时代码说明主窗体设置工作到计时休息倒计时源码久坐提醒桌面小程序依赖库.NetFramework4.5HandyControl3.2网上下的一些小程序,达不到自己想要的效果,要么就是功能复杂,于是选择了自己开发。采用WPF......
  • c#串口通信讲解(一)(winform、wpf)
    转载:https://blog.csdn.net/weixin_30466421/article/details/99278174串口操作需要注意的几点如下:1、如果是USB转串口;则需要安装USB转串口驱动,附件有此驱动。2、串口打开状态最好不要直接插拔串口,可能会导致中控板或者串口线烧坏。3、使用串口调试工具CEIWEI,下一章节会贴上......