.net 禁用FlowDocumentScrollViewer';s打印命令绑定(并改用我的窗口';s!)

.net 禁用FlowDocumentScrollViewer';s打印命令绑定(并改用我的窗口';s!),.net,wpf,flowdocumentscrollviewer,.net,Wpf,Flowdocumentscrollviewer,在我的WPF应用程序中,我创建了一个窗口,其中包含一个FlowDocumentScrollViewer,以及其他控件 我已经为我的窗口创建了一个命令绑定到Print命令,其中执行了一个处理程序,该处理程序运行一些自定义逻辑,并最终打印了FlowDocumentScrollViewer的内容 一切都很好,但我有一个问题 如果用户在FlowDocumentScrollViewer中单击,然后按Ctrl+p,则会执行FlowDocumentScrollViewer本身的打印命令绑定,而不是我的窗口的打

在我的WPF应用程序中,我创建了一个
窗口
,其中包含一个
FlowDocumentScrollViewer
,以及其他控件

我已经为我的窗口创建了一个命令绑定到Print命令,其中执行了一个处理程序,该处理程序运行一些自定义逻辑,并最终打印了FlowDocumentScrollViewer的内容

一切都很好,但我有一个问题

如果用户在FlowDocumentScrollViewer中单击,然后按Ctrl+p,则会执行FlowDocumentScrollViewer本身的打印命令绑定,而不是我的窗口的打印命令绑定。所以我的自定义逻辑没有被执行,打印输出也不是应该的


如何禁用FlowDocumentScrollViewer的打印命令绑定,并确保在任何情况下按Ctrl+p都能运行Windows的打印命令绑定?

一种快速而肮脏的方法是挂接FlowDocumentScrollViewer的
预览向下
事件,并在按Ctrl+p时将其设置为已处理。下面是代码的样子:

    void fds_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
    {
        if (e.Key == Key.P && Keyboard.Modifiers == ModifierKeys.Control)
            e.Handled = true;
    }

我将事件处理程序从窗口中删除,并将其直接连接到FlowDocumentScrollViwer,从而使其正常工作:

<FlowDocumentScrollViewer x:Name="MyFlowDocumentScrollViewer">
    <FlowDocumentScrollViewer.CommandBindings>
        <CommandBinding Command="Print" Executed="Print_Executed" />
    </FlowDocumentScrollViewer.CommandBindings>
</FlowDocumentScrollViewer>


然后,我必须将任何其他打印命令控件(例如,我的工具栏按钮)的CommandTarget直接绑定到FlowDocumentScrollViewer。

这真是太酷了——我以前在其他情况下也使用过这种技术!但我用了一种稍微干净一点的方法(见我的答案)。谢谢