【WPF】命令系统

命令四要素

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>

 

posted @ 2022-08-17 14:28  小林野夫  阅读(151)  评论(0编辑  收藏  举报
原文链接:https://www.cnblogs.com/cdaniu/