首页 > 其他分享 >【WPF】命令系统

【WPF】命令系统

时间:2022-08-17 14:34:49浏览次数:43  
标签:CanExecute 绑定 系统 目标 命令 WPF commandbing

命令四要素

1、命令,一般情况都是使用 ”路由ui命令“

2、命令源:触发命令的地方。

3、命令绑定:将命令和执行方法绑定,然后在将commandbing放置在,命令目标的外围ui控件上,这样命令才能起作用。

4、命令目标:指定命令作用的地方。命令目标的设定会影响到commandbing 是否起作用。

原理

 

 

 

 

 

 注意:PreviewExecuted、Executed、PreviewCanExecute、CanExecute 是Commandmanger 附加在命令目标上的附加路由事件(附加路由事件情况深入浅出WPF P171)。

PreviewExecuted、Executed 只有在命令源触发时候,命令目标才会发射PreviewExecuted、Executed。

PreviewCanExecute、CanExecute:只要命令源绑定命令目标后就由命令目标不停的发射PreviewCanExecute、CanExecute。

命令目标的绑定有两种方式:1、在命令源处设置CommandTarget="{Binding ElementName=text3}     2、系统自动获取键盘焦点作为命令目标。

 详细解说查看 深入浅出WPF P177

 

绑定命令目标

1、错误的设置,把commandbing设置在命令目标 范围之内

 

 

 

 

 错误代码

<Window x:Class="WpfApp1.MainWindow"
        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:WpfApp1"
        mc:Ignorable="d"
        Name="winfrom"
        Title="MainWindow" Height="450" Width="800">
 
    <Window.Resources>
        <CommandBinding Command="New"  x:Key="Clearcommand" Executed="CommandBinding_Executed_1" CanExecute="CommandBinding_CanExecute_1"/>
    </Window.Resources>
    <Border BorderThickness="5" BorderBrush="Orange">
        <Grid x:Name="gridroot" Button.Click="gridroot_Click">
            <Border BorderThickness="5" BorderBrush="Orange" Width="500" Height="350">
                <StackPanel    >


                    <TextBox Name="text1">

                    </TextBox>

                    <TextBox Name="text2" Height="100"></TextBox>
                    <Button Command="New" Name="text" CommandTarget="{Binding ElementName=text3}">触发命令按钮</Button>
                    <Button  Content="按钮2"  Command="New"    />
                    <Border BorderThickness="5" BorderBrush="Orange" Width="300" Height="250">
                        <Grid  >
                       
                            <StackPanel>
                              
                                <TextBox Name="text3" Height="50">命令目标</TextBox>
                                <Border BorderThickness="5" BorderBrush="Orange" Width="100" Height="150">
                                    <Grid>
                                        
                                        <Grid.CommandBindings >
                                            <!--写以下代码的时候编译器不会提示 -->
                                            <StaticResource ResourceKey="Clearcommand"/>

                                        </Grid.CommandBindings>
                                        <TextBlock TextWrapping="WrapWithOverflow">不能把CommandBinding 放在命令目标范围内 ,那样命令无法正常运行</TextBlock>
                                    </Grid>
                                </Border>
                                <Button  Content="按钮3"  Height="40"   />
                            </StackPanel>
                        </Grid>
                    </Border>
                </StackPanel>
            </Border>
         
        </Grid>
    </Border>
</Window>

正确的方式

必须把commandbing设置在命令目标范围之外,命令才能正常运行。

 

 

<Window x:Class="WpfApp1.MainWindow"
        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:WpfApp1"
        mc:Ignorable="d"
        Name="winfrom"
        Title="MainWindow" Height="450" Width="800">
 
    <Window.Resources>
        <CommandBinding Command="New"  x:Key="Clearcommand" Executed="CommandBinding_Executed_1" CanExecute="CommandBinding_CanExecute_1"/>
    </Window.Resources>
    <Border BorderThickness="5" BorderBrush="Orange">
        <Grid x:Name="gridroot" Button.Click="gridroot_Click">
            <Border BorderThickness="5" BorderBrush="Orange" Width="500" Height="350">
                <StackPanel    >


                    <TextBox Name="text1">

                    </TextBox>

                    <TextBox Name="text2" Height="100"></TextBox>
                    <Button Command="New" Name="text" CommandTarget="{Binding ElementName=text3}">触发命令按钮</Button>
                    <Button  Content="按钮2"  Command="New"    />
                    <Border BorderThickness="5" BorderBrush="Orange" Width="300" Height="250">
                        <Grid  >
                            <Grid.CommandBindings >
                                <!--写以下代码的时候编译器不会提示 -->
                                <StaticResource ResourceKey="Clearcommand"/>

                            </Grid.CommandBindings>
                            <StackPanel>
                              
                                <TextBox Name="text3" Height="50">命令目标</TextBox>
                                <Border BorderThickness="5" BorderBrush="Orange" Width="100" Height="150">
                                    <Grid>
                                        
                                      
                                        <TextBlock TextWrapping="WrapWithOverflow">不能把CommandBinding 放在命令目标范围内 ,那样命令无法正常运行</TextBlock>
                                    </Grid>
                                </Border>
                                <Button  Content="按钮3"  Height="40"   />
                            </StackPanel>
                        </Grid>
                    </Border>
                </StackPanel>
            </Border>
         
        </Grid>
    </Border>
</Window>

 

标签:CanExecute,绑定,系统,目标,命令,WPF,commandbing
From: https://www.cnblogs.com/cdaniu/p/16594827.html

相关文章

  • uniapp 获取系统信息
    uni-app提供了异步(uni.getSystemInfo)和同步(uni.getSystemInfoSync)的2个API获取系统信息。系统信息返回的内容非常多,各操作系统、各家小程序、各浏览器对它们的定义也......
  • ASP.NET Core依赖注入系统学习教程:5.生命周期
    在现实生活中,生命周期一词往往代表着某些人或事物从生到死的过程,而在依赖注入框架中,生命周期中的“生与死”体现为服务实例的创建和释放。实际上对于介绍依赖注入框架的生......
  • 软件系统中如何保证数据的完整性
    信息系统中产生数据,修改数据,删除数据,查询数据,都要保证数据的完整性,一致性1.完整性数据的类型:字符串,数值,货币,时间,布尔等数据的长度:数据的存储空间数据的规则:身份证,手机......
  • HDFS shell命令行常用操作
    1、创建文件夹hadoopfs-mkdir[-p]...path为待创建的目录-p选项的行为与Unixmkdir-p非常相似,它会沿着路径创建父目录。hadoopfs-mkdir-p/wjb/itcast 2......
  • 命令执行(1)
    web29-web42参考博客1参考博客21、web29题目:error_reporting(0);if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/flag/i",$c)){eval($c);......
  • shell中系统任务设置
    shell中系统任务设置1、系统启动流程启动计算机的硬件(BIOS)读取时间选择对应的启动模式(USBHDDEFI)如果是Linux系统,回去找/boot目录.引导这个系统启动计算机系统......
  • ceph常用命令
    检查集群使用状态cephhealthdetail把块设备映射到操作系统rbdmapssdcache/cb7329af-fe8f-4845-bbc8-5ae5c69a5588取消映射块设备rbdunmap/dev/rbd1查看系统......
  • Linux centos7查看防火墙状态及配置命令
    查看防火墙状态systemctlstatusfirewalld锁定防火墙systemctlmaskfirewalld.service解锁防火墙systemctlunmaskfirewalld.service开启防火墙s......
  • 【环境配置】| vscode中命令行运行如何设置默认环境、切换环境?
    1转到setting.json使用快捷键CTRL+SHIFT+P从调出的窗口中输入'python',选择解释器(Interpreter)2查看当前环境3选择目标环境4测试......
  • linux 中 sed命令替换命令时i选项忽略大小写
     001、(base)root@PC1:/home/test4#lsa.txt(base)root@PC1:/home/test4#cata.txtedsdgdEdGDf(base)root@PC1:/home/test4#sed's/e/MMM/'a.txt......