一般的な RelayCommand クラスを使用しています。ビジュアル ツリーのずっと上に、いくつかの一般的な文字ショートカットを使用して UserControl.InputBindings に関連付けられた多くのコマンドがあります。TextBoxもあります。ただし、TextBox にフォーカスがあり、コマンドにバインドされているキーのいずれかを押すと、コマンドが実行され、文字が TextBox に表示されません。私は、フォーカスされた要素がキーを使用して処理済みとしてマークする最初のチャンスがあると考えていました。コマンドが最初にトリガーされるのはなぜですか? ツリーのさらに下にある他の入力コントロールがイベントを処理しない場合にのみトリガーしたい。
更新: コードの重要な部分は、CommandManager.TranslateInput の下部にあるようです。ここで分解:
bool continueRouting = false;
RoutedCommand routedCommand = command as RoutedCommand;
if (routedCommand != null)
{
if (routedCommand.CriticalCanExecute(parameter, target, inputEventArgs.UserInitiated, out continueRouting))
{
continueRouting = false;
CommandManager.ExecuteCommand(routedCommand, parameter, target, inputEventArgs);
}
}
else if (command.CanExecute(parameter))
command.Execute(parameter);
inputEventArgs.Handled = !continueRouting;
ICommand を使用して、Handled が true を返さないようにする方法はありません。私の唯一のオプションは、CommandManager を直接呼び出す UIElement.OnKeyDownThunk に行く前に、TextBox がキー入力を処理するようにすることです。または、InputBinding 以外に RelayCommand をトリガーする他の方法はありますか? スタック トレースは次のとおりです。
> Asi.ViewModelShared.dll!Asi.ViewModelShared.RelayCommand.Execute(object parameter) Line 50 C#
PresentationCore.dll!System.Windows.Input.CommandManager.TranslateInput(System.Windows.IInputElement targetElement, System.Windows.Input.InputEventArgs inputEventArgs) + 0x5c5 bytes
PresentationCore.dll!System.Windows.UIElement.OnKeyDownThunk(object sender, System.Windows.Input.KeyEventArgs e) + 0x52 bytes
PresentationCore.dll!System.Windows.Input.KeyEventArgs.InvokeEventHandler(System.Delegate genericHandler, object genericTarget) + 0x2c bytes
PresentationCore.dll!System.Windows.RoutedEventArgs.InvokeHandler(System.Delegate handler, object target) + 0x33 bytes
PresentationCore.dll!System.Windows.RoutedEventHandlerInfo.InvokeHandler(object target, System.Windows.RoutedEventArgs routedEventArgs) + 0x44 bytes
PresentationCore.dll!System.Windows.EventRoute.InvokeHandlersImpl(object source, System.Windows.RoutedEventArgs args, bool reRaised) + 0x1a8 bytes
PresentationCore.dll!System.Windows.UIElement.RaiseEventImpl(System.Windows.DependencyObject sender, System.Windows.RoutedEventArgs args) + 0x73 bytes
PresentationCore.dll!System.Windows.UIElement.RaiseTrustedEvent(System.Windows.RoutedEventArgs args) + 0x3d bytes
PresentationCore.dll!System.Windows.UIElement.RaiseEvent(System.Windows.RoutedEventArgs args, bool trusted) + 0x40 bytes
PresentationCore.dll!System.Windows.Input.InputManager.ProcessStagingArea() + 0x1f8 bytes
PresentationCore.dll!System.Windows.Input.InputManager.ProcessInput(System.Windows.Input.InputEventArgs input) + 0x45 bytes
PresentationCore.dll!System.Windows.Input.InputProviderSite.ReportInput(System.Windows.Input.InputReport inputReport) + 0x62 bytes
PresentationCore.dll!System.Windows.Interop.HwndKeyboardInputProvider.ReportInput(System.IntPtr hwnd, System.Windows.Input.InputMode mode, int timestamp, System.Windows.Input.RawKeyboardActions actions, int scanCode, bool isExtendedKey, bool isSystemKey, int virtualKey) + 0xee bytes
PresentationCore.dll!System.Windows.Interop.HwndKeyboardInputProvider.ProcessKeyAction(ref System.Windows.Interop.MSG msg, ref bool handled) + 0xac bytes
PresentationCore.dll!System.Windows.Interop.HwndSource.CriticalTranslateAccelerator(ref System.Windows.Interop.MSG msg, System.Windows.Input.ModifierKeys modifiers) + 0x94 bytes
PresentationCore.dll!System.Windows.Interop.HwndSource.OnPreprocessMessage(object param) + 0x12c bytes