Я все еще делаю опыты с командами и RoutedEvents. Без использования RoutedCommands я пытаюсь реализовать простую программу ver.Где я могу найти CommandTarget?
Вот мой Command класс:
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 -это фон изменений «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.
Итак - что я делаю неправильно? Я что-то забыл?
Неужели никто здесь не может помочь? – CodeCannibal
Хотя ваша программа проста, но ее сложно выполнить. Попытайтесь лучше описать желаемое поведение. Чтобы быть полезным: вы можете начать искать здесь. С [MSDN] (http://msdn.microsoft.com/en-us/library/system.windows.input.icommandsource.commandtarget.aspx): «В Windows Presentation Foundation (WPF), свойство CommandTarget на ICommandSource применимо только тогда, когда ICommand является RoutedCommand. Если CommandTarget установлен на ICommandSource, и соответствующая команда не является RoutedCommand, целевой параметр игнорируется. " – nemesv