2012-05-31 11 views
2

Я все еще делаю опыты с командами и 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.

Итак - что я делаю неправильно? Я что-то забыл?

+0

Неужели никто здесь не может помочь? – CodeCannibal

+0

Хотя ваша программа проста, но ее сложно выполнить. Попытайтесь лучше описать желаемое поведение. Чтобы быть полезным: вы можете начать искать здесь. С [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

ответ

0

OriginalSource - источник сообщения о событии, основанный на проверке чистого удара. См.: http://msdn.microsoft.com/en-us/library/system.windows.routedeventargs.originalsource.aspx.

В этом случае оно возвращает ваше окно, потому что оно не разрешает ни одному из дочерних элементов в его визуальном дереве.

Для доступа к CommandTarget вы должны использовать args.Source.

Смежные вопросы