精华内容
下载资源
问答
  • WPF 入门
    2020-09-01 21:50:03

    1. xaml文件编译成baml,嵌入到dll或者exe中;

    2.常用的布局容器:

    3. WPF常见的控件类型继承关系如下:

     

    4. 触发器trigger一般设置在style中,也可以写在控件中,有以下五种类型:

    更多相关内容
  • 介绍了如何使用Visual Studio 2013创建一个WPF应用程序
  • WPF入门指南教程.pdf

    2020-04-17 13:51:07
    WPF入门教程,也是从别的地方花钱下下来的,放在CSDN为所需要的朋友提供帮助。
  • WPF入门实例,http://blog.csdn.net/u010476739/article/details/77430803
  • WPF入门教程

    2018-08-15 13:09:58
    wpf入门教程,很使用的,只要你坚持看,坚持练习你就能学会哦!
  • WPF入门教程+源码

    2018-06-30 19:30:39
    很好WPF入门资料,非常适合想学习WPF的新手,而且还有配套的源代码.
  • WPF 入门(一)

    2021-08-02 20:02:22
    入门介绍引用博客园相关文章: https://www.cnblogs.com/zh7791/category/1528742.html 参考书籍《深入浅出WPF》-- 刘铁锰 二、WPF定义 WPF全称:Windows Presentation Foundation WPF是一个可创建桌面客户端...

    一、参考

    入门介绍引用博客园相关文章:

    https://www.cnblogs.com/zh7791/category/1528742.html

    参考书籍《深入浅出WPF》-- 刘铁锰

    二、WPF定义

    WPF全称:Windows Presentation Foundation

    WPF是一个可创建桌面客户端应用程序的 UI 框架。 WPF 开发平台支持广泛的应用开发功能,包括应用模型、资源、控件、图形、布局、数据绑定、文档和安全性。 此框架是 .NET Framework 的一部分,因此,如果你曾经使用 ASP.NET 或 Windows 窗体通过 .NET 构建应用程序,应该会熟悉此编程体验。 WPF 使用 Extensible Application Markup Language (XAML),为应用编程提供声明性模型。

    三、XAML 语言

    XAML 是一种基于 XML 的标记语言,以声明形式实现应用程序的外观。 通常用它定义窗口、对话框、页面和用户控件,并填充控件、形状和图形。

    下面的示例使用 XAML 来实现包含一个按钮的窗口的外观:

    <Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        Title="Window with Button"
        Width="250" Height="100">
    ​
      <!-- Add button to window -->
      <Button Name="button">Click Me!</Button>
    </Window>

    其对应的窗体如下图所示:

    四、WPF布局

    • WPF布局原则

      • 一个窗口中只能包含一个元素

      • 不应显示设置元素尺寸

      • 不应使用坐标设置元素的位置

      • 可以嵌套布局容器

    • WPF布局容器

      • StackPanel: 水平或垂直排列元素、Orientation属性分别: Horizontal / Vertical

      • WrapPanel : 水平或垂直排列元素、针对剩余空间不足会进行换行或换列进行排列

      • DockPanel : 根据容器的边界、元素进行Dock.Top、Left、Right、Bottom设置

      • Grid : 类似table表格、可灵活设置行列并放置控件元素、比较常用

      • UniformGrid : 指定行和列的数量, 均分有限的容器空间

      • Canvas : 使用固定的坐标设置元素的位置、不具备锚定停靠等功能。

    五、WPF控件

    常见控件分类

    控件类型说明
    布局控件可以容纳多个控件或嵌套其他布局控件,用于在UI上组织和排列控件。Grid、StackPanel、DockPanel等控件都属于此类,它们拥有共同的父类Panel
    内容控件只能容纳一个其他控件或布局控件作为它的内容。Window、Button等控件属于此类、因为只能容纳一个控件作为起内容,所以经常需要借助布局控件来规划起内容。它们共同父类是ContentControl。
    带标题内容控件相当于一个内容控件,但可以添加一个标题(Header),标题部分亦可以容纳一个控件或者布局。GroupBox、TabItem等是这类控件的典型代表。它们的共同父类是HeaderedControl。
    条目控件可以显示一列数据,一般情况下这列数据的类型相同。此类控件包括ListBox、CombBox等。它们的共同基类是ItemsControl。此类控件在显示集合类型的数据方面功能非常强大。
    带标题条目控件相当于一个条目控件加上一个标题显示区。TreeViewItem、MenuItem都属于此类控件。这类控件往往用于显示层级关系数据。节点显示在其Header区域,子节点则显示在其条目控件区域。此类控件的共同基类是HeaderItemsControl。
    特殊内容控件比如TextBox容纳的是字符串、TextBlock可以容纳自由控制格式的文本、Image容纳图片类型数据……这类控件相对比较独立。

    控件派生关系图

    控件说明

    六、样式和触发器

    样式

    WPF中的各类控件元素, 都可以自由的设置其样式。 诸如:

    • 字体(FontFamily)

    • 字体大小(FontSize)

    • 背景颜色(Background)

    • 字体颜色(Foreground)

    • 边距(Margin)

    • 水平位置(HorizontalAlignment)

    • 垂直位置(VerticalAlignment) 等等。

    而样式则是组织和重用以上的重要工具。不是使用重复的标记填充XAML, 通过Styles创建一系列封装所有这些细节的样式。然后通过Style属性应用封装好的样式。这点类似于CSS样式。然而, WPF样式的功能更加强大, 如控件的行为。WPF的样式还支持触发器。

    为了能够直观了解到样式(Style)的使用方法, 下面演示一个从传统的定义控件样式到使用Style组织样式的方法。

    下面的例子中, 给4个TextBlock设置同样的样式: 字体、字体大小、字体颜色、加粗设置。

    效果图与实际代码如下所示:

    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
        <TextBlock Text="TextStyle1" FontFamily="宋体" FontSize="20" Foreground="Blue" />
        <TextBlock Text="TextStyle2" FontFamily="宋体" FontSize="20" Foreground="Blue"/>
        <TextBlock Text="TextStyle3" FontFamily="宋体" FontSize="20" Foreground="Blue" />
        <TextBlock Text="TextStyle4" FontFamily="宋体" FontSize="20" Foreground="Blue" />
        <TextBlock Text="TextStyle5" FontFamily="宋体" FontSize="20" Foreground="Blue" />
    </StackPanel>

    上面有讲到, 样式是组织和重用的工具。 而上面的代码, 由于每个元素都是相同的, 但是每个元素XAML都重复定义。 下面将介绍通过样式如何优化上面的代码。

    • 第一步: 在Resources目录下定义一个TextBlockStyle的样式, 完整代码如下:

    <Window.Resources>
        <Style x:Key="TextBlockStyle" TargetType="{x:Type TextBlock}">
            <Setter Property="FontFamily" Value="宋体" />
            <Setter Property="FontSize" Value="20" />
            <Setter Property="Foreground" Value="Blue" />
        </Style>
    </Window.Resources>
    • 第二步:通过控件的Style属性 来引用x:key 的样式, 代码如下:

    <Window.Resources>
        <Style x:Key="TextBlockStyle" TargetType="{x:Type TextBlock}">
            <Setter Property="FontFamily" Value="宋体" />
            <Setter Property="FontSize" Value="20" />
            <Setter Property="Foreground" Value="Blue" />
        </Style>
    </Window.Resources>
    <Grid>
        <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
            <TextBlock Text="TextStyle1" Style="{StaticResource TextBlockStyle}"/>
            <TextBlock Text="TextStyle2" Style="{StaticResource TextBlockStyle}" />
            <TextBlock Text="TextStyle3" Style="{StaticResource TextBlockStyle}" />
            <TextBlock Text="TextStyle4" Style="{StaticResource TextBlockStyle}" />
            <TextBlock Text="TextStyle5" Style="{StaticResource TextBlockStyle}" />
        </StackPanel>
    </Grid>

    注意: 当控件引用了某个样式, 在控件本身并没有定义该属性的情况下,优先使用样式中的定义,否则优先控件本身的定义。如下所示, 样式中设置了颜色为 Blue, 但是控件本身又设置了Green, 那么控件的最终效果 Green。

    <Window.Resources>
        <Style x:Key="TextBlockStyle" TargetType="{x:Type TextBlock}">
            <Setter Property="FontFamily" Value="宋体" />
            <Setter Property="FontSize" Value="20" />
            <Setter Property="Foreground" Value="Blue" />
        </Style>
    </Window.Resources>
    <Grid>
        <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
            <TextBlock Text="TextStyle1" Foreground="Green" 
                       Style="{StaticResource TextBlockStyle}"/>
            <TextBlock Text="TextStyle2" Style="{StaticResource TextBlockStyle}" />
            <TextBlock Text="TextStyle3" Style="{StaticResource TextBlockStyle}" />
            <TextBlock Text="TextStyle4" Style="{StaticResource TextBlockStyle}" />
            <TextBlock Text="TextStyle5" Style="{StaticResource TextBlockStyle}" />
        </StackPanel>
    </Grid>

    触发器

    顾名思义, 触发器可以理解为, 当达到了触发的条件, 那么就执行预期内的响应, 可以是样式、数据变化、动画等。 触发器通过 Style.Triggers集合连接到样式中, 每个样式都可以有任意多个触发器, 并且每个触发器都是 System.Windows.TriggerBase的派生类实例, 以下是触发器的类型:

    • Trigger : 监测依赖属性的变化、触发器生效

    • MultiTrigger : 通过多个条件的设置、达到满足条件、触发器生效

    • DataTrigger : 通过数据的变化、触发器生效

    • MultiDataTrigger : 多个数据条件的触发器

    • EventTrigger : 事件触发器, 触发了某类事件时, 触发器生效。

    Trigger

    <Window.Resources>
        <Style x:Key="BorderStyle" TargetType="{x:Type Border}">
            <Setter Property="BorderThickness" Value="5" />
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value="Blue"/>
                    <Setter Property="BorderBrush" Value="Red"/>
                </Trigger>
                <Trigger Property="IsMouseOver" Value="False">
                    <Setter Property="Background" Value="Red" />
                    <Setter Property="BorderBrush" Value="Blue" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid>
        <Border Width="100" Height="100" Style="{StaticResource BorderStyle}" />
    </Grid>

    实际效果:

    MultiTrigger

    和Trugger类似, MultiTrigger可以设置多个条件满足时, 触发, 下面以TextBox为例, 做一个简单的Demo 当鼠标进入文本框的范围, 并且光标设置到TextBox上, 则把TextBox的背景颜色改变成Red

    <Window.Resources>
        <Style x:Key="TextBoxStyle" TargetType="{x:Type TextBox}">
            <Setter Property="BorderThickness" Value="1" />
            <Style.Triggers>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="IsMouseOver" Value="True"/>
                        <Condition Property="IsFocused" Value="True"/>
                    </MultiTrigger.Conditions>
                    <MultiTrigger.Setters>
                        <Setter Property="Background" Value="Red"/>
                    </MultiTrigger.Setters>
                </MultiTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid>
        <StackPanel VerticalAlignment="Center">
            <TextBox Width="100" Height="30" Style="{DynamicResource TextBoxStyle}"/>
            <Button Width="100" Height="30" Margin="0 10 0 0"/>
        </StackPanel>
    </Grid>

    实际效果:

    七、WPF Binding

    什么是绑定(Binding)

    在winform中, 我们常常会用到各种类型的赋值, 例如:

    • button1.Text="Hello";

    • label.Text="Hello";

    • ...

    类似这种赋值操作, 我们之所以不称之为绑定, 主要原因是因为他们大多数操作都是一次性的, 无论是数据还是按钮本身发生变化,对两者而言都是不可见的。 而绑定的概念则侧重于: 两者的关联,协议与两者之间的影响。 首先, 从一个简单的例子来理解什么是绑定。

    • 创建一个滑块控件, 并且希望在滑动的过程中, 把值更新到另外一个静态文本上。代码如下:

      <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
          <Slider Name="slider" Width="200"/>
          <TextBlock Text="" HorizontalAlignment="Center"/>
      </StackPanel>

    在winform中, 我们常规的做法会给滑块创建一个值改变事件,同时将滑块的值赋值给文本。 接下来, 我只需要在静态文本中添加一小段绑定的声明,即可完整原本很复杂的操作:

    • Text={Binding ElementName=slider,Path=Value}

      • {Binding }: Binding的声明语法, 一对尖括号,开头声明以Binding 开始。

      • ElementName= : 该声明意为, 设置元素的名称

      • Path: 设置关联元素的位置,上例中设置为元素的value属性。

    那么该如何理解整句话的意义, 翻译: 静态文本TextBlock的Text属性将通过绑定的方式关联到元素名'slider'的value属性上。

    <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
        <Slider Name="slider" Width="200"/>
        <TextBlock Text="{Binding ElementName=slider, Path=Value}"                                          HorizontalAlignment="Center"/>                         
    </StackPanel> 

    效果图所示:

    可以看到,在滑块不断的滑动过程中, TextBlock也在不断的发生变化, 说明TextBlock已经得到了滑动滑动过程中的值变化, 这种关联, 我们称之为绑定, 在WPF当中, 绑定又分很多种, 而上面这种则是通过元素绑定的方式。 理解了基础的绑定之后,然后就是理解绑定的模式。

    绑定的模式就类似我们商业中的合作, 是一次性回报还是持续获益, 是否可以单方面终止, 是否具有投票权等, 在WPF中绑定的模式又分为五种:

    • OneWay(单向绑定) : 当源属性发生变化更新目标属性, 类似上面的例子中, 滑动变化更新文本的数据。示例:

      <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
          <Slider Name="slider" Width="200"/>
          <TextBlock Text="{Binding ElementName=slider, Path=Value ,Mode=OneWay}"
                             HorizontalAlignment="Center"/>
      </StackPanel>

    效果:

    • TwoWay(双向绑定) : 当源属性发生变化更新目标属性, 目标属性发生变化也更新源属性。

      <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
          <Slider Name="slider" Width="200"/>
          <TextBlock Text="{Binding ElementName=slider, Path=Value ,Mode=TwoWay}"
                             HorizontalAlignment="Center"/>
      </StackPanel>

    • OneTime(单次模式) : 根据第一次源属性设置目标属性, 在此之后所有改变都无效。

      • 如第一次绑定了数据源为0, 那么无论后面如何改变 2、3、4... 都无法更新到目标属性上。

    • OneWayToSource : 和OneWay类型一样, 只不过整个过程倒置。示例:

      <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
          <Slider Name="slider" Width="200"/>
          <TextBlock Text="{Binding ElementName=slider, Path=Value ,Mode=OneWayToSource}"
                             HorizontalAlignment="Center"/>
      </StackPanel>

    • Default : 既可以是双向,也可以是单项, 除非明确表明某种模式, 否则采用该默认绑定。

    绑定到非元素上

    上面的代码中,使用的绑定方式是根据元素的方式: ElementName=xxx, 如需绑定到一个非元素的对象, 则有一下几属性:

    • Source : 指向一个数据源, 示例, TextBox使用绑定的方式用Source指向一个静态资源ABC:

      <Window.Resources>
          <TextBlock x:Key="txt1">abc</TextBlock>
      </Window.Resources>
      <Grid>
          <TextBox Text="{Binding Source={StaticResource txt1},Path=Text}"/>
      </Grid>
    • RelativeSource : 使用一个名为RelativeSource的对象来根据不同的模式查找源对象。

      示例, 使用RelativeSource的FindAncestor模式, 查找父元素为StackPanel的Width值

      <StackPanel Width="200">
       <StackPanel Width="300"/>
       <!--TextBlock 的Text值为200-->
       <TextBlock Text="{Binding Path=Width,
                   RelativeSource={RelativeSource Mode=FindAncestor,
                   AncestorType={x:Type StackPanel}}}"/>
      </StackPanel>

    • DataContext: 从当前的元素树向上查找到第一个非空的DataContext属性为源对象。

      示例, 该示例用后台代码创建一个只包含Name的类, Test, 通过绑定窗口的DataContext上下文:

      public partial class Window1 : Window
       {
           public Window1()
           {
               InitializeComponent();
               this.DataContext = new Test() { Name ="小明"}
           }
           public class Test
           {
               public string Name { get; set; }
           }
       }
      <Grid>
       <!-- 绑定后台生成的Name-->
       <TextBlock Text="{Binding Name}" />
      </Grid>

    • 后台代码绑定简单文本与列表

      创建一个PageModel类, 定一个ClassName为班级名称, 和一个Students学生列表,

      后台代码:

       public partial class Window1 : Window
       {
           public Window1()
           {
               InitializeComponent();
               PageModel page = new PageModel();
               page.ClassName = "高二三班";
               page.Studets = new List<Student>();
               page.Studets.Add(new Student() 
                                { Name=  "张三", Age = 18, Sex = "男" });
               page.Studets.Add(new Student()
                                { Name = "李四", Age = 19, Sex = "女" });
               page.Studets.Add(new Student() 
                                { Name = "王五", Age = 20, Sex = "男" });
               this.DataContext = page;
           }
           public class PageModel
           {
               public string ClassName { get; set; }
               public List<Student> Studets { get; set; }
               public class Student
               {
                   public string Name { get; set; }
                   public int Age { get; set; }
                   public string Sex { get; set; }
               }
           }
       }

      窗口代码:

      <Grid>
       <Grid.RowDefinitions>
           <RowDefinition Height="20"/>
           <RowDefinition/>
       </Grid.RowDefinitions>
       <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
           <Button Command="{Binding UpdateCommand}" Content="刷新"/>
           <TextBlock Margin="5 0 0 0" Text="班级名称:"/>
           <TextBlock Margin="5 0 0 0" Text="{Binding ClassName}"/>
       </StackPanel>
       <DataGrid Grid.Row="1" ItemsSource="{Binding Students}" AutoGenerateColumns="False">
           <DataGrid.Columns>
               <DataGridTextColumn Binding="{Binding Name}" Header="姓名"/>
               <DataGridTextColumn Binding="{Binding Age}" Header="年龄"/>
               <DataGridTextColumn Binding="{Binding Sex}" Header="性别"/>
           </DataGrid.Columns>
       </DataGrid>
      </Grid>

      效果预览

    八、WPF事件

    参考:

    https://blog.csdn.net/akadiao/article/details/95757744?spm=1001.2014.3001.5501

    • 事件处理器与代码后置

      CLR事件模型/直接事件模型:在下图所示的事件模型中,事件的响应者通过订阅直接关联在事件拥有者的事件。

    示例 事件拥有者:Button 事件:Click 事件响应者:窗体 事件处理器:button1_Click()方法

    <Grid Margin="10">
        <Button x:Name="Button" Content="确定" Width="90" Height="30" Background="LightPink"               Click="Button_Click"/>
    </Grid>

    后台代码

    public partial class MainWindow: Window {
    	public MainWindow() {
    		InitializeComponent();
    	}
    	private void Button_Click(object sender, RoutedEventArgs e) {
    		MessageBox.Show("Hello WPF!");
    	}
    }

    效果如图:

    路由事件

    事件的路由环境是UI组件树。分为逻辑树(Logical Tree),可视元素树(Visual Tree)。

    • 逻辑树:

    逻辑树就是描述WPF界面元素的实际构成,它是由程序在XAML中所有的UI元素组成。最显著的特点就是由布局控件、或者其他常用的控件组成。

    • 可视元素树:

    可视树是由界面上可见的元素构成的,这些元素主要是由从Visual或者Visual3D类中派生出来的类。 上面代码中的Window、Grid、StackPanel、TextBox它们本身就包含一些由Visual或者Visual3D类派生出的一些可视树的元素来组成的。

    路由事件定义

    功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件。 实现定义:路由事件是一个 CLR 事件,可以由 RoutedEvent 类的实例提供支持并由WPF 事件系统来处理。

    前台代码(简化,去掉了控件背景色)

    <Grid>
       <Grid Name="RootSecond"  HorizontalAlignment="Center" ButtonBase.Click="Button_Click">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" MinWidth="100"/>
                <ColumnDefinition Width="*" MinWidth="100"/>
            </Grid.ColumnDefinitions>
            <StackPanel Name="LeftPanel" Grid.Column="0"  HorizontalAlignment="Center" 
                            VerticalAlignment="Center">
               <Button Name="LeftButton" Width="50" Content="Left" Click="LeftButton_Click"/>
            </StackPanel>
            <StackPanel Name="RightPanel" Grid.Column="1" HorizontalAlignment="Center" 
                            VerticalAlignment="Center">
                <Button Name="RightButton" Width="50" Content="Right"/>
            </StackPanel>
        </Grid>
    </Grid>

    后台代码

    private void LeftButton_Click(object sender, RoutedEventArgs e) {
    	MessageBox.Show("这是一个点击事件");
    }
    
    private void Button_Click(object sender, RoutedEventArgs e) {
    	if ("RightButton".Equals((e.OriginalSource as FrameworkElement).Name)) {
    		MessageBox.Show("这是一个路由事件");
    	}
    }

    九、WPF命令

    WPF命令模型具有4个重要元素:

    • 命令——命令表示一个程序任务,并且可跟踪该任务是否能被执行。然而,命令实际上不包含执行应用程序的代码,真正处理程序在命令目标中。

    • 命令源——命令源触发命令,即命令的发送者。例如Button、MenuItem等控件都是命令源,单击它们都会执行绑定的命令。

    • 命令目标——命令目标是在其中执行命令的元素。如Copy命令可以在TextBox控件中复制文本。

    • 命令绑定——前面说过,命令是不包含执行程序的代码的,真正处理程序存在于命令目标中。那命令是怎样映射到处理程序中的呢?这个过程就是通过命令绑定来完成的,命令绑定完成的就是红娘牵线的作用。

    WPF命令模型的核心就在于ICommand接口了,该接口定义命令的工作原理。该接口的定义如下所示:

    public interface ICommand
    {
        // Events
        event EventHandler CanExecuteChanged;
        // Methods
        //命令是否可使用
        bool CanExecute(object parameter); 
        //命令后续执行的方法
        void Execute(object parameter);
    }

    代码绑定命令示例:

    后端代码

    public partial class MainWindow: Window {
    
    	//申明并定义命令
    	private RoutedCommand clearCmd = new RoutedCommand("Clear", typeof(MainWindow));
    
    	public MainWindow() {
    		InitializeComponent();
    		//命令初始化
    		InitialiizeCommand();
    	}
    	//初始化命令
    	private void InitialiizeCommand() {
    		//把命令赋值给命令源(发送者)并指定快捷方键
    		this.ClearButton.Command = this.clearCmd;
    		this.clearCmd.InputGestures.Add(new KeyGesture(Key.C, ModifierKeys.Alt));
    
    		//指定命令目标
    		this.ClearButton.CommandTarget = this.searchValue;
    
    		//创建命令联
    		CommandBinding cb = new CommandBinding();
    		cb.Command = this.clearCmd; //只关注与clearCmd相关事件
    		cb.CanExecute += new CanExecuteRoutedEventHandler(cb_CanExecute);
    		cb.Executed += new ExecutedRoutedEventHandler(cb_Executed);
    
    		//把命令关联安置到外围控件上
    		this.tabPanel.CommandBindings.Add(cb);
    	}
    
    	//当探测命令是否可以执行是,此方法被调用
    	void cb_CanExecute(object sender, CanExecuteRoutedEventArgs e) {
    		if (string.IsNullOrEmpty(this.searchValue.Text)) {
    			e.CanExecute = false;
    		} else {
    			e.CanExecute = true;
    		}
    		//避免继续向上传而降低程序性能
    		e.Handled = true;
    	}
    
    	void cb_Executed(object sender, ExecutedRoutedEventArgs e) {
    		this.searchValue.Clear();
    		//避免继续向上传而降低程序性能
    		e.Handled = true;
    	}
    }

    前端代码

    <StackPanel Grid.Row="0" Margin="5" HorizontalAlignment="Left" VerticalAlignment="Center">
    	<TabPanel Name="tabPanel">
    		<TextBlock Text="用户姓名:" />
    		<TextBox Name="searchValue" Width="100" />
    		<Button Name="ClearButton" Content="命令方式清除" HorizontalAlignment="Right"
    		/>
    	</TabPanel>
    </StackPanel>

    命令传参

    前端代码

    <StackPanel Grid.Row="0" Margin="5" Width="200" Height="150">
        <TabPanel Name="tabPanel" Width="200" Height="50">
            <TextBlock Text="用户姓名:" />
            <TextBox Name="searchValue" Width="100" />
        </TabPanel>
        <TabPanel Name="tabPane2" Width="200" Height="50">
            <Button  Command="New" Content="命令传参添加" CommandParameter="new"/>
            <Button  Command="New" Content="命令传参添加" CommandParameter="show"/>
        </TabPanel>
    </StackPanel>

    后端代码

    public partial class MainWindow: Window {
    	public MainWindow() {
    		InitializeComponent();
    	}
    	//当探测命令是否可以执行是,此方法被调用
    	void New_CanExecute(object sender, CanExecuteRoutedEventArgs e) {
    		e.CanExecute = true;
    		e.Handled = true;
    	}
    	void New_Executed(object sender, ExecutedRoutedEventArgs e) {
    		if (e.Parameter.ToString() == "show") {
    			MessageBox.Show("命令方式传参“Show”");
    		} else if (e.Parameter.ToString() == "new") {
    			this.searchValue.Text += e.Parameter.ToString();
    		}
    		//避免继续向上传而降低程序性能
    		e.Handled = true;
    	}
    }

    展开全文
  • wpf入门第五篇 WPF with ECharts 示例项目源码,详细介绍可以查看博客 : https://blog.csdn.net/wf824284257/article/details/89002133
  • wpf经典入门教程.pdf

    2020-12-22 16:52:57
    wpf入门教程。在学校了解过wpf但是并没有项目经验,拿来学,非常适合想要入门wpf开发并且有C#编程基础的童鞋
  • wpf入门第三篇 ControlTemplate、Trigger与Storyboard 的示例代码,具体情况可以查看博主的博客: https://blog.csdn.net/wf824284257/article/details/88783979
  • WPF入门教程系列目录 WPF入门教程系列二——Application介绍 WPF入门教程系列三——Application介绍(续) WPF入门教程系列四——Dispatcher介绍 WPF入门教程系列五——Window 介绍 WPF入门教程系列六——布局...

    本文转载连接: https://www.cnblogs.com/chillsrc/p/4464023.html

     

    WPF入门教程系列目录

    WPF入门教程系列二——Application介绍

    WPF入门教程系列三——Application介绍(续)

    WPF入门教程系列四——Dispatcher介绍

    WPF入门教程系列五——Window 介绍

    WPF入门教程系列六——布局介绍与Canvas(一)

    WPF入门教程系列七——布局之WrapPanel与StackPanel(二)

    WPF入门教程系列八——布局之Grid与UniformGrid(三)

    WPF入门教程系列九——布局之DockPanel与ViewBox(四)

    WPF入门教程系列十——布局之Border与ViewBox(五)

    WPF入门教程系列十一——依赖属性(一)

    WPF入门教程系列十二——依赖属性(二)

    WPF入门教程系列十三——依赖属性(三)

    WPF入门教程系列十四——依赖属性(四)

    WPF入门教程系列十五——WPF中的数据绑定(一)

    WPF入门教程系列十六——WPF中的数据绑定(二)

    WPF入门教程系列十七——WPF中的数据绑定(三)

    WPF入门教程系列十八——WPF中的数据绑定(四)

    WPF入门教程系列十九——ListView示例(一)

    WPF入门教程系列二十——ListView示例(二)

    WPF入门教程系列二十一——DataGrid示例(一)

    WPF入门教程系列二十二——DataGrid示例(二)

    WPF入门教程系列二十三——DataGrid示例(三)

     

     

    一、 前言    

          最近在学习WPF,学习WPF首先上的是微软的MSDN,然后再搜索了一下网络有关WPF的学习资料。为了温故而知新把学习过程记录下来,以备后查。这篇主要讲WPF的开发基础,介绍了如何使用Visual Studio 2013创建一个WPF应用程序。

     

    首先说一下学习WPF的基础知识:

    1) 要会一门.NET所支持的编程语言。例如C#。

    2) 会一点“标准通用标记语言”:WPF窗体程序使用的XAML语言,也属于“标准通用标记语言”的一个分支。如果以前接触过XML、HTML、XHTML、ASP.NET之类的“标准通用标记语言”,对于学习是有所帮助的。

    3) 有一定的WinForm或ASP.NET经验,主要是对控件事件的处理要有所了解。

    4) 拥有良好的面向对象的思想:在WPF中,经常要灵活运用各种继承关系、多态、重载等。

    5) DataBinding要有所了解:Binding是WPF的一大亮点。

    6) 对设计模式要有一定的了解:当然是越深入越好了,在实际项目中,各种设计模式经常交融使用。 

      

    二、 本系列使用到的工具:

    1) 开发环境:Windows 7中文版

    2) 开发工具:Visual Studio 2013中文版

    3) 数据库:本机SQL Server 2012 Express 

    4) ORM工具:Entity Framework(实体框架)。

    Entity Framework与NHibernate比较:

    1)Entity Framework封装性更好,增、删、改、查询更方便

    2)  Entity Framework使用更方便的Linq to Entity查询,延迟加载(只有在需要时才加载,只加载需要的数据)。

     

    三、WPF开发基础

    第一、在装好以上所说的工具之后,打开Visual Studio 2013,选择“菜单—》文件—》新建—》项目”。如下图。  

     

     

    第二、在“新建项目”对话框中选择“WPF应用程序”,修改名称为WpfApp1,然后点击“确定”按钮,便成功创建了一个“WPF应用程序”。新创建的项目所引用的公共类库如下。如下图。(“WPF应用程序”会在“引用”里面自动添加下图中所示的 PresentationCore、PresentationFramework、WindowsBase三大核心程序集)。

     

    第三、WpfApp1项目的生成的文件结构。如下图。

     

     

    第四、在App.xaml中的“StartupUri”属性可以指定项目运行时的启动窗体。如下图中“StartupUri=”MainWindow.xaml””,还可以定义我们需要的系统资源以及引入程序集等。如下图。 

    第五、在MainWindow.xaml的设计窗体中我们可以修改Title。还可以设置MainWindow的属性和添加事件。完成了这些设置以后,我们就可以对窗体添加内容了,如下图。我在这个窗体中添加了一个ListView、两个WrapPanel、两个Button等。 

     

    第六、在WPF的xmal文件中还可以添加如下资源。如下图。

     

    四、小结

    WPF应用程序的创建除了使用Visual Studio之外,还可以使用Expression Blend。

    谈到学习WPF的开发,就必须要学习MVVM,学习MVVM,就要首先了解MVC、MVP等概念。

    我自己做过WinForm、ASP.NET等使用各类.NET技术的项目,虽然微软的技术一直在进步、变化,但是最基本的东西都没有变,例如数据库的访问,文件的读写、日志处理,程序中异常的处理、报表、打印、性能的优化、友好的界面。

    展开全文
  • 课程介绍了从桌面应用的了解,到WPF开发思维的转换,从基本的面向控件操作到面向数据模型的开发过程,详细介绍了WPF开发中数据与行为处理过程中的核心思想与逻辑,对绑定、通知属性与命令有基本的认识。通过课程可以...
  • WPF 入门教程Grid

    2021-11-15 18:55:32
    网格可能是最复杂的面板类型。一个 Grid 可以包含多个行和列。... 推荐一款WPF MVVM框架开源项目:Newbeecoder.UI Newbeecoder.UI开源项目 Demo下载: Newbeecoder.UI开源项目https://share.weiyun.com/py6W1dcK

    网格可能是最复杂的面板类型。一个 Grid 可以包含多个行和列。您可以为每一行定义一个高度,为每一列定义一个宽度,以像素的绝对数量、可用空间的百分比或作为自动,其中行或列将根据内容。当其他面板无法完成工作时使用网格,例如,当您需要多列并且经常与其他面板结合使用时。

    在最基本的形式中,Grid 将简单地采用您放入其中的所有控件,拉伸它们以使用最大的可用空间并将其放置在彼此的顶部:

    <Window x:Class="WpfTutorialSamples.Panels.Grid"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Grid" Height="300" Width="300">
        <Grid>
    		<Button>Button 1</Button>
    		<Button>Button 2</Button>
    	</Grid>
    </Window>

    最后一个控件获得了顶部位置,这意味着您甚至看不到第一个按钮。不过在大多数情况下并不是非常有用,所以让我们尝试划分空间,这正是网格做得很好的地方。我们通过使用 ColumnDefinitions 和 RowDefinitions 来做到这一点。在第一个示例中,我们将坚持使用列:

    <Window x:Class="WpfTutorialSamples.Panels.Grid"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Grid" Height="300" Width="300">
        <Grid>
    		<Grid.ColumnDefinitions>
    			<ColumnDefinition Width="*" />
    			<ColumnDefinition Width="*" />
    		</Grid.ColumnDefinitions>
    		<Button>Button 1</Button>
    		<Button Grid.Column="1">Button 2</Button>
    	</Grid>
    </Window>

    在这个例子中,我们简单地将可用空间分成两列,它们将使用“星形宽度”(这将在后面解释)平均共享空间。在第二个按钮上,我使用所谓的附加属性将按钮放置在第二列(0 是第一列,1 是第二列,依此类推)。我也可以在第一个按钮上使用这个属性,但它会自动分配给第一列和第一行,这正是我们在这里想要的。

    如您所见,控件占用了所有可用空间,这是网格排列其子控件时的默认行为。它通过将其子控件上的 Horizo​​ntalAlignment 和 VerticalAlignment 设置为 Stretch 来实现此目的。

    在某些情况下,您可能希望它们只占用所需的空间和/或控制它们在网格中的放置方式。最简单的方法是直接在要操作的控件上设置 Horizo​​ntalAlignment 和 VerticalAlignment。这是上述示例的修改版本:

    <Window x:Class="WpfTutorialSamples.Panels.Grid"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Grid" Height="300" Width="300">
        <Grid>
    		<Grid.ColumnDefinitions>
    			<ColumnDefinition Width="*" />
    			<ColumnDefinition Width="*" />
    		</Grid.ColumnDefinitions>		
    		<Button VerticalAlignment="Top" HorizontalAlignment="Center">Button 1</Button>
    		<Button Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Right">Button 2</Button>
    	</Grid>
    </Window>

    从生成的屏幕截图中可以看出,第一个按钮现在位于顶部并居中。第二个按钮位于中间,与右侧对齐。

    推荐一款WPF MVVM框架开源项目:Newbeecoder.UI

    Newbeecoder.UI开源项目

    Demo下载:

    Newbeecoder.UI开源项目icon-default.png?t=M3K6https://share.weiyun.com/py6W1dcK

    展开全文
  • WPF入门教学(C#窗口、客户端)

    千次阅读 2021-03-30 16:20:41
    一开始是使用C#窗口程序,发现C#窗口程序对于图片的处理有问题,图片四周的锯齿很明显,然后查找了微软有没有其他编译器,发现了WPF,摸索花费了一些时间。为了后来者,减少些时间熟悉WPF,下面直入主题: 1,打开VS...
  • WPF入门增删改查

    2018-10-19 13:30:36
    WPF入门增删改查绝对可用,初学者使用的,绝对可用!
  • WPF入门电子书

    2013-02-28 08:52:36
    wpf入门书籍,简单易懂,适合新手阅读,可以很快达到入门效果
  • wpf入门第二篇 MVVM与binding的示例代码,详情可以查看博主的这篇博客: https://blog.csdn.net/wf824284257/article/details/88758707
  • 这是wpf入门第四篇 VisualState 的示例项目源码。 具体介绍请查看博客:https://blog.csdn.net/wf824284257/article/details/88989991
  • WPF入门教程示例

    2021-04-15 01:33:54
    WPF入门教程资料收集常用布局属性常用布局容器GridStackPanelWrapPanelDockPanelUniformGrid控件结构Marginpadding触发器 资料收集 大神WPF入门教程 常用布局属性 代码 含义 HorizontalAlignment 用于设置...
  • WPF入门第6篇 界面绑定属性刷新 INotifyPropertyChanged 的示例项目源码。 具体可以查看博客 : https://blog.csdn.net/wf824284257/article/details/89083825
  • 概述.NET5 发布已经有一阵子了,今天抽空体验一哈,搭建一个WPF项目实例,看看和传统的.NET Framework有什么区别!开发环境:VS2019WPF框架:Caliburn.Micro 版本4.0.173.NET版本:.NET5.0项目创建步骤详述step1:...
  • WPF第一个DEMO 最近学习WPF,由于此前并未接触过C#相关项目。本次学习,分两个部分,该部分存粹使用常规设计方式。即使用非MVVM设计模式。后续会重写一个MVVM模式的代码。 预览效果 本次主要实现对学生的增删改查...
  • wpf入门资料[整理].pdf

    2021-10-12 01:57:55
    wpf入门资料[整理].pdf
  • WPF入门教程
  • WPF入门教程系列

    2016-08-27 00:28:19
    WPF从零学起的
  • 一、运行效果图 CSND下载链接:下载链接 Gitee地址:下载连接 二、代码结构 .net版本 5.0 VS 版本:VS2019 16.11.3 三、主要逻辑说明 3.1 MainWindow.xaml.cs 主要代码: 采用MVVM模式绑定数据: ...
  • WPF入门增-删-改-查

    2019-03-04 12:57:56
    WPF入门增-删-改-查,附带数据库 SQL 2008 R2 及以上数据库,附脚本。 欢迎下载使用。保证发誓绝对能用,祝您早日入门。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,450
精华内容 3,780
关键字:

wpf入门

友情链接: dos.rar