从头开始WPF(1)

为什么用wpf而不是winform

  1. XML 使用xml标记语言来代替winform的Designer.cs
  2. 生成了逻辑树和可视化树。其中包含依赖属性,路由事件,样式模板,留到日后细讲。
  3. 数据绑定 就是Binding。可谓是wpf的精髓之一,通过它可以非常快捷的实现mvvm
  4. 布局的改变,不在是winform中默认的坐标式布局(在wpf为Canvas)。拥有流式布局StackPanel,会自动换行的WrapPanel,边界式布局DockPanel,网格布局Grid,
  5. WPF core版本,虽然不用mono只能在window上运行。但是可以使用aspcore里面的类对象了,更加方便

XML

将view视图的设计操作从过程是代码中脱离(其实还是可以再过程是代码中编辑布局的),将会在编译程序的时候生成二进制文件(BAML格式的,体积压缩)嵌入到DLL或者EXE中。
熟悉了xml之后编辑起来非常方便
这里我添加了一个button控件并且设置他的水平居中和垂直居中都为center,默认Stretch,细节日后再讲

<Grid>
    <Button Content="sdf" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Grid>

这里我添加了一个button控件并且设置他的水平居中和垂直居中都为center,默认Stretch,细节日后再讲
之后我给他的button中添加一个图片

<Grid>
    <Button VerticalAlignment="Center" HorizontalAlignment="Center">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="auto"/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <materialDesign:PackIcon Kind="FoodAppleOutline" Margin="-5 0 5 0"/>
            <TextBlock Text="sdf" Grid.Column="1"/>
        </Grid>
    </Button>
</Grid>

在这里插入图片描述
这个就是xml以及wpf的魅力,他的富内容和xml结合起来可以非常快捷的编辑出一个非常漂亮的视图(这里我用了一个皮肤组件,日后再聊)

逻辑树和可视化数

简单的来说,可视化树代表你界面上所有的渲染在屏幕上的元素。而逻辑树就是一层层的对象形成的树形结构了。
拿上面我写的一个button来举例子。下图中,前面的图标就是icon,‘sdf’就是textblock。他们的父级中就有button。这就是树形结构
在这里插入图片描述
逻辑树比可视树多了数据的管理,例如依赖属性,路由事件,样式继承等。
wpf 中所有的依赖属性其实都是DependencyObject对象。具体解释可以自行百度,这里是微软的解释: 依赖属性介绍。日后再聊
路由事件其实和html里面的事件冒泡差不多。日后再聊
样式模板其实也和html的css类似。日后再聊

MVVM模式下的Binding

binding默认的位置是从DataContext这个属性中查找。这个属性在FrameworkElement中被申明。控件都是继承于FrameworkElement的所以都有这个属性。
command在wpf中被定义为命令,即都要实现这个接口ICommand,里面包含了这个命令是否可以被执行(CanExecute),是否可以被执行更改事件(CanExecuteChanged)以及执行函数(Execute)。
我们接下来定义一个Say的command。

 public class Say : ICommand
    {
        public event EventHandler CanExecuteChanged;

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public void Execute(object parameter)
        {
            MessageBox.Show("sdf");
        }
    }

然后再添加一个test.class,在其中添加一个name和say的属性

   public  class test
    {
        public test() {
            Name = "222";
            Say = new Say();
                 
        }
        public string Name { get; set; }
        public Say Say { get; set; }
    }

重新生成项目,确保没有出错。然后再mainwindow中输入这段代码。

 <Window.DataContext>
        <local:test/>
    </Window.DataContext>

并且更改原先的button

<Button VerticalAlignment="Center" HorizontalAlignment="Center"  Command="{Binding Say}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="auto"/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <materialDesign:PackIcon Kind="FoodAppleOutline" Margin="-5 0 5 0" />
                <TextBlock Text="{Binding Name}" Grid.Column="1"/>
            </Grid>
        </Button>

之后重新运行。点击按钮。
在这里插入图片描述
效果就是这样样子,吧逻辑放入到datacontext中,实现了视图和逻辑的拆分(mvvm)。还有一些第三方库可以快捷的搭建,日后再聊。

布局格式

所有的布局都是继承自Panel
在这里插入图片描述
具体细节不同多水。接下来秀一个WrapPanel的可升缩布局。
代码:

<Grid >
        <ListView>
            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel  Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListView}, Path=ActualWidth}"/>
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>
            <Button Content="sdf" Width="150"/>
            <Button Content="sdf" Width="150"/>
            <Button Content="sdf" Width="150"/>
            <Button Content="sdf" Width="150"/>
            <Button Content="sdf" Width="150"/>
            <Button Content="sdf" Width="150"/>
            <Button Content="sdf" Width="150"/>
            <Button Content="sdf" Width="150"/>
            <Button Content="sdf" Width="150"/>
            <Button Content="sdf" Width="150"/>
            <Button Content="sdf" Width="150"/>
            <Button Content="sdf" Width="150"/>
            <Button Content="sdf" Width="150"/>
            <Button Content="sdf" Width="150"/>
        </ListView>
    </Grid>

在这里插入图片描述
具体解释日后再聊

WPF core

wpf core已经出来一段时间了,但是在编辑界面并不支持他的实时显示。当然可以魔改,可以效果并不怎样。优势当然是可以无缝调用aspcore写的类了,例如在aspcore中写的viewmode。当然不是wpfcore可以使用这个viewmodel。不过要在viewmodel的项目文件上改一个东西。

  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;net4.5</TargetFrameworks>
  </PropertyGroup>

在这里插入图片描述

挖坑

挖坑正式开始。日后我会不定期的吧后续的内容补上。
欢迎加入Q群聊天交流(虽然不是我的群):874752819
我的联系qq:1442241179.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值