2

我仍在使用 Commands 和 RoutedEvents 进行体验。在不使用 RoutedCommands 的情况下,我尝试实现一个非常简单的程序。

这是我的命令类:

public class ColorChanger : ICommand
{
    public static readonly RoutedEvent ChangeMyColor = EventManager.RegisterRoutedEvent("ChangeMyColor", RoutingStrategy.Direct, typeof(RoutedEventHandler), typeof(ColorChanger));

    public void Execute(object parameter)
    {
        RoutedEventArgs eventArgs  = new RoutedEventArgs(ChangeMyColor);
        Keyboard.FocusedElement.RaiseEvent(eventArgs);
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;

    public static void AddChangeMyColorHandler(DependencyObject o, RoutedEventHandler handler)
    {
        ((UIElement)o).AddHandler(ColorChanger.ChangeMyColor, handler);
    }

    public static void RemoveChangeMyColorHandler(DependencyObject o, RoutedEventHandler handler)
    {
        ((UIElement)o).AddHandler(ColorChanger.ChangeMyColor, handler);
    }
}

为了确保我对该命令具有静态访问权限,我创建了一个静态类来保存所有命令:

 public static class AppCommands
{
    private static ColorChanger colorChanger = new ColorChanger();

    public static ColorChanger ColorChanger
    {
        get { return colorChanger; }
    }
}

这是您将在我的 MainWindow.xaml 中找到的内容:

<StackPanel>
    <Menu>
        <MenuItem Command="{x:Static local:AppCommands.ColorChanger}" Header="ClickMe"
          CommandTarget="{Binding ElementName=mainTextBox}" x:Name="menue1"/>
    </Menu>
    <TextBox Name="mainTextBox"/>
</StackPanel>

我想要的是通过单击menue1-item 'mainTextBox'的背景发生变化。那么让我们看看我的 MainWindow.cs 内部:

 public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        AddHandler(ColorChanger.ChangeMyColor,new RoutedEventHandler(test));
    }

    public void test(object sender, RoutedEventArgs args)
    {
        Control someCtl = (Control) args.OriginalSource;
        someCtl.Background = Brushes.BlueViolet;
    }
}

该程序正在工作 - 但不正确:) 它总是改变 MainWindow 的背景,但不是我的 CommandTarget。

那么 - 我做错了什么?我是不是忘记了什么?

4

1 回答 1

0

OriginalSource是基于纯命中测试的事件报告源。请参阅:http: //msdn.microsoft.com/en-us/library/system.windows.routedeventargs.originalsource.aspx

在这种情况下,它会返回您的窗口,因为它不会解析到其可视树中的任何子元素。

要访问您的 CommandTarget,您应该使用args.Source.

于 2013-04-11T18:21:12.113 回答