深入浅出WPF--笔记(2015.03.27)

命令具有一处声明,处处使用的特点。微软在WPF类库中准备了一些便捷的命令库,包括:

(1)、ApplicationCommands;

(2)、ComponentCommands;

(3)、NavigationCommands;

(4)、MediaCommands;

(5)、EditingCommands

都是静态类,而命令就是用这些类的静态只读属性以单件模式暴露出来。

命令源一定是实现了ICommandSource接口的对象,而ICommandSource有一个属性是CommandParameter.示例如下:

XAML代码:

<Window x:Class="MyTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="WPF" Height="240" Width="360">
    <Grid Margin="6">
        <Grid.RowDefinitions>
            <RowDefinition Height="24"/>
            <RowDefinition Height="4"/>
            <RowDefinition Height="24"/>
            <RowDefinition Height="4"/>
            <RowDefinition Height="24"/>
            <RowDefinition Height="4"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <TextBlock Text="Name:" VerticalAlignment="Center" HorizontalAlignment="Left" Grid.Row="0"/>
        <TextBox x:Name="nameTextBox" Margin="60, 0, 0, 0" Grid.Row="0"/>
        <Button Content="New Teacher" Command="New" CommandParameter="Teacher" Grid.Row="2"/>
        <Button Content="New Student" Command="New" CommandParameter="Student" Grid.Row="4"/>
        <ListBox x:Name="listBoxNewItems" Grid.Row="6"/>
    </Grid>
    <Window.CommandBindings>
        <CommandBinding Command="New" CanExecute="New_CanExecute" Executed="New_Executed"/>
    </Window.CommandBindings>
</Window>

C#代码:

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

private void New_CanExecute(object sender, CanExecuteRoutedEventArgs e)
        {
            if (string.IsNullOrEmpty(this.nameTextBox.Text))
                e.CanExecute = false;
            else
                e.CanExecute = true;
        }

private void New_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            string name = this.nameTextBox.Text;
            if (e.Parameter.ToString() == "Teacher")
                this.listBoxNewItems.Items.Add(string.Format("New Teacher: {0},学而不厌,诲人不倦。", name));
            if (e.Parameter.ToString() == "Student")
                this.listBoxNewItems.Items.Add(string.Format("New Student: {0},好好学习,天天向上。", name));
        }
    }

============================================================================

自定义命令示例如下:

XAML代码:

<UserControl x:Class="MyTest.MiniView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d"
             d:DesignHeight="114" d:DesignWidth="200">
    <Border CornerRadius="5" BorderBrush="LawnGreen" BorderThickness="2">
        <StackPanel>
            <TextBox x:Name="textBox1" Margin="5"/>
            <TextBox x:Name="textBox2" Margin="5, 0"/>
            <TextBox x:Name="textBox3" Margin="5"/>
            <TextBox x:Name="textBox4" Margin="5, 0"/>
        </StackPanel>
    </Border>
</UserControl>

C#代码:

public partial class MiniView : UserControl, IView
    {
        public MiniView()
        {
            InitializeComponent();
        }

public bool IsChanged { get; set; }
        public void SetBinding() { }
        public void Refresh() { }
        public void Save() { }
        public void Clear()
        {
            this.textBox1.Clear();
            this.textBox2.Clear();
            this.textBox3.Clear();
            this.textBox4.Clear();
        }
    }

--------------------------------------------------------------------------------------------------------------------------------------

public interface IView
    {
        bool IsChanged { get; set; }

void SetBinding();
        void Refresh();
        void Clear();
        void Save();
    }

public class MyCommandSource : UserControl, ICommandSource
    {
        public ICommand Command { get; set; }
        public object CommandParameter { get; set; }
        public IInputElement CommandTarget { get; set; }

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
        {
            base.OnMouseLeftButtonDown(e);
            if (null != this.CommandTarget)
                this.Command.Execute(this.CommandTarget);
        }
    }

public class ClearCommand : ICommand
    {
        public event EventHandler CanExecuteChanged;

public bool CanExecute(object parameter)
        {
            throw new NotImplementedException();
        }

public void Execute(object parameter)
        {
            IView view = parameter as IView;
            if (null != view)
                view.Clear();
        }
    }

-------------------------------------------------------------------------------------------------------------------------------

主窗体XAML代码:

<Window x:Class="MyTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:MyTest"
    Title="WPF" Height="205" Width="250">
    <StackPanel>
        <local:MyCommandSource x:Name="ctrlClear" Margin="10">
            <TextBlock Text="清除" FontSize="16" TextAlignment="Center" Background="LightGreen" Width="80"/>
        </local:MyCommandSource>
        <local:MiniView x:Name="miniView"/>
    </StackPanel>
</Window>

C#代码:

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

ClearCommand clearCmd = new ClearCommand();
            this.ctrlClear.Command = clearCmd;
            this.ctrlClear.CommandTarget = this.miniView;
        }
    }

==============================================================================

正规的方法是把命令声明在静态全局的地方供所有对象使用。

时间: 2024-10-10 07:45:46

深入浅出WPF--笔记(2015.03.27)的相关文章

深入浅出WPF之Binding -- 笔记(2015.03.01)

当使用一个集合或DataView作为Binding的源时,如果想把它的默认元素当作Path使用,则需要使用"/"语法:如果集合元素的属性仍然还是一个集合,又想把子级集合中的元素当作Path,则可以使用多级斜线的语法(即一路"斜线"下去): 事例一: XAML: <StackPanel>        <TextBox x:Name="textBox1" BorderBrush="Black" Margin=&

深入浅出WPF--笔记(2015.03.21)

RoutedEventArgs有两个属性:OriginalSource和Source,这两个属性都表示路由事件传递的起点(即事件消息的源头),OriginalSource表示VisualTree上的源头,而Source表示的是LogicalTree上的消息源头.事例如下: XAML代码: <UserControl x:Class="MyTest.MyUserControl"             xmlns="http://schemas.microsoft.com/

深入浅出WPF--笔记(2015.03.20)

·路由事件与直接事件的区别:直接事件激发时,发送者直接将消息通过事件订阅交送给事件响应者,事件响应者使用其事件处理器方法对事件的发生作出响应.驱动程序逻辑按客户需求运行:路由事件的事件拥有者和事件响应者之间则没有直接显示的订阅关系,事件的拥有者只负责激发事件,事件将由谁响应它并不知道,事件的响应者则安装有事件侦听器,针对某类事件进行侦听,当有此类事件传递至此时,事件响应者就使用事件处理器来响应事件并决定事件是否可以继续传递. 要在哪个控件侦听控件,就调用哪个控件的AddHandler方法把想侦听

深入浅出WPF--笔记(2015.03.12)

类的作用只是把散落在程序中的变量和函数进行归档封装并控制对它们的访问.被封装在类里的变量称为字段(Field),表示的是类或实例的状态:被封装在类里的函数称为方法(Method),表示类或实例的功能.是否使用static关键字来修饰字段或方法则取决于字段或方法是对类有意义还是对类的实例有意义. C#语言规定:对类有意义的字段和方法使用static关键字修饰,称为静态成员,通过类名加访问修饰符(即"."操作符)访问它们:对类的实例有意义的字段和方法不加static关键字,称为非静态成员或

深入浅出WPF--笔记(2015.03.29)

使用资源的方式有两种:静态方式和动态方式.静态资源使用(StaticResource)指的是在程序载入内存时对资源的一次性使用,之后就不会再去访问该资源:动态资源使用(DynamicResource)指的是在程序运行过程中仍然会去访问的资源.示例如下: XAML代码: <Window x:Class="MyTest.MainWindow"    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentatio

深入浅出WPF--笔记(2015.03.15)

附加属性说一个属性本来不属于某个对象,但由于某种需要而被后来附加上.也就是把对象放入一个特定环境后对象才具有的属性(表现出来就是被环境赋予的属性)就称为附加属性(Attached Property). 附加属性的作用就是将属性与数据类型(宿主)解耦,让数据类型的设计更加灵活.附加属性的本质就是依赖属性(snippet: propa).注册附加属性使用的是名为RegisterAttached的方法,且附加属性使用两个方法分别包装. XAML: <StackPanel Background="

深入浅出WPF笔记

数据层(Database,Oracle等) 业务逻辑层(Service,Data Access Layer,WCF) 表示层(WPF,Win Form,ASP.net,Silverlight) [WPF开发方法论] AS-IS:UI事件驱动程序运行(Win Form)--TO-BE:数据驱动程序运行并显示在UI上(WPF) XAML:WPF技术中专门用于设计UI的语言. 逻辑树(logical tree):不考虑控件内部的组成结构,只观察由控件组成的"树". 可视元素树(visual

2015/03/27 &nbsp; 压缩和解包

一.gzip压缩和解包 1. 压缩; [[email protected] ~]# gzip 2.txt 2. 解包; [[email protected] ~]# gzip -d 2.txt.gz 3. 查看包压缩的内容; [[email protected] ~]# zcat 1.txt.gz 二.bzip压缩和解包 1. 压缩; [[email protected] ~]# bzip2 2.txt 2. 解包; [[email protected] ~]# bzip2 -d 2.txt.b

《深入浅出WPF》笔记——绘画与动画

<深入浅出WPF>笔记——绘画与动画 本篇将记录一下如何在WPF中绘画和设计动画,这方面一直都不是VS的强项,然而它有一套利器Blend:这方面也不是我的优势,幸好我有博客园,能记录一下学习的过程.在本记录中,为了更好的理解绘画与动画,多数的例子还是在VS里面敲出来的.好了,不废话了,现在开始. 一.WPF绘画 1.1基本图形 在WPF中可以绘制矢量图,不会随窗口或图型的放大或缩小出现锯齿或变形,除此之外,XAML绘制出来的图有个好处就是便于修改,当图不符合要求的时间,通常改某些属性就可以完成