【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>
编程是个人爱好
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
2021-08-17 5、CPU 的线程与操作系统的线程有何关系?操作系统中的进程和线程是什么关系?
2021-08-17 1、cpu架构和工作原理
2021-08-17 【C#基础概念】程序集Assembliy