kev*_*aub 6 c# wpf xaml routedcommand
我很难理解RoutedCommand的CommandTarget属性.
基本上,我有一些静态命令,在用户控件(而不是窗口)中有实现.我在用户控件中创建了一个命令绑定.如果我在usercontrol中声明了按钮,那么我就可以使用我的路由事件了.但是,当按钮位于usercontrol之外时,我无法使用我的路由事件.我认为命令目标将解决我的问题.
那么如何为工具栏usercontrol的按钮设置commandtarget,以便调用Container的Executed和CanExecuted?
编辑代码与micahtan更改的更改,但我仍然无法将其发送到CanExecute或Execute.
窗口XAML:
<Window x:Class="RoutedCommands.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:RoutedCommands"
xmlns:toolbar="clr-namespace:RoutedCommands.Toolbar"
Title="Window1" Height="300" Width="300">
<StackPanel>
<local:Container Width="100" Height="25" x:Name="MyContainer" />
<toolbar:Toolbar Width="100" Height="25" CommandTarget="{Binding MyContainer}" />
</StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
工具栏XAML:
<UserControl x:Class="RoutedCommands.Toolbar.Toolbar"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:RoutedCommands"
x:Name="MyToolbar"
Height="300" Width="300">
<Grid>
<Button Command="{x:Static local:Commands.MyCommand}" Content="Try Me" CommandTarget="{Binding ElementName=MyToolbar, Path=CommandTarget, Mode=OneWay}" />
</Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
工具栏CS:
public partial class Toolbar : UserControl
{
public Toolbar()
{
InitializeComponent();
}
// Using a DependencyProperty as the backing store for CommandTarget. This enables animation, styling, binding, etc...
public static readonly DependencyProperty CommandTargetProperty =
DependencyProperty.Register("CommandTarget", typeof(IInputElement), typeof(Toolbar), new UIPropertyMetadata(null));
public IInputElement CommandTarget
{
get { return (IInputElement)GetValue(CommandTargetProperty); }
set { SetValue(CommandTargetProperty, value); }
}
}
Run Code Online (Sandbox Code Playgroud)
容器XAML:
<UserControl x:Class="RoutedCommands.Container"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:RoutedCommands"
Height="300" Width="300">
<UserControl.CommandBindings>
<CommandBinding Command="{x:Static local:Commands.MyCommand}" CanExecute="CommandBinding_CanExecute" Executed="CommandBinding_Executed" />
</UserControl.CommandBindings>
<Grid>
<Button Command="{x:Static local:Commands.MyCommand}" Content="Click Me" />
</Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
集装箱CS:
public partial class Container : UserControl
{
public Container()
{
InitializeComponent();
}
private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
Console.WriteLine("My Command Executed");
}
private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
Console.WriteLine("My Command Can Execute");
e.CanExecute = true;
}
}
Run Code Online (Sandbox Code Playgroud)
RoutedCommands:
namespace RoutedCommands
{
public static class Commands
{
public static readonly RoutedUICommand MyCommand = new RoutedUICommand();
}
}
Run Code Online (Sandbox Code Playgroud)
如果你想使用CommandTargets,我会在你的自定义UserControl上创建一个CommandTarget DependencyProperty,类似于它在ButtonBase上定义的方式.
完成后,将Button的CommandTarget设置为自定义UserControl的CommandTarget.
编辑:代码示例
如果您正在进行MVVM架构,Rudi的注释是有效的 - 在这种情况下,RelayCommands或其他形式的包装代理都可以正常工作.根据您的代码示例,它看起来并不像您使用的那种方法,因此我的原始评论.
至于代码,您只需要更改ToolBar类.这假设您的MyCommand类继承自RoutedUICommand.这是XAML:
<UserControl
x:Class="WPFCommandTarget.CustomToolBar"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WPFCommandTarget"
x:Name="theControl">
<Grid>
<Button
x:Name="theButton"
Command="{x:Static local:Commands.MyCommand}"
CommandTarget="{Binding ElementName=theControl, Path=CommandTarget, Mode=OneWay}"
Content="Try Me" />
</Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
这是代码隐藏的代码:
使用System.Windows; 使用System.Windows.Controls;
namespace WPFCommandTarget
{
/// <summary>
/// Interaction logic for CustomToolBar.xaml
/// </summary>
public partial class CustomToolBar : UserControl
{
public CustomToolBar()
{
InitializeComponent();
}
public IInputElement CommandTarget
{
get { return (IInputElement)GetValue(CommandTargetProperty); }
set { SetValue(CommandTargetProperty, value); }
}
// Using a DependencyProperty as the backing store for CommandTarget. This enables animation, styling, binding, etc...
public static readonly DependencyProperty CommandTargetProperty =
DependencyProperty.Register("CommandTarget", typeof(IInputElement), typeof(CustomToolBar), new UIPropertyMetadata(null));
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我已经更改了测试项目中的一些类名/命名空间.你必须改变它们以满足你的需要.
| 归档时间: |
|
| 查看次数: |
31503 次 |
| 最近记录: |