我正在使用InputManager檢查控件的更改是由用戶還是代碼完成。這工作正常,除非用戶使用上下文菜單進行剪切/複製/粘貼。如果用戶在文本框中執行ctrl + v,InputManager會正確地通知它。但是,如果粘貼是從文本框的上下文菜單中完成的,則InputManager不會觸發PreNotifyInput或PostNotifyInput事件。有人知道爲什麼或者如何檢測這些用戶操作?以下是一個工作示例。由於PreNotifyInput從不觸發,所以用戶在上面的文本框中使用剪切/複製/粘貼菜單時,下面的文本塊永遠不會更新。InputManager忽略從菜單啓動時的剪切/複製/粘貼
XAML:
<Window x:Class="InputMgrDemo.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300">
<StackPanel>
<TextBox TextChanged="TextBox_TextChanged" />
<TextBlock Name="_text" />
</StackPanel>
</Window>
後面的代碼:
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
namespace InputMgrDemo
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
InputManager.Current.PreNotifyInput += ((sender, e) => _userInput = true);
InputManager.Current.PostNotifyInput += ((sender, args) => _userInput = false);
}
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
if (_userInput)
{
_text.Text = (sender as TextBox).Text;
}
}
private bool _userInput;
}
}
感謝您的(一如既往)詳細的答案。它幫助我理解了這個問題。我很好奇,你怎麼知道命令是通過調度器回調完成的? – 2010-06-14 16:51:01
在TextChanged事件中設置斷點,然後查看調用堆棧。 TextChanged由TextBoxBase調用,由數據綁定代碼調用,該代碼由MenuItem單擊處理代碼調用,該代碼由Dispatcher調用。由於MenuItem點擊處理代碼由Dispatcher調用,因此您知道MenuItem使用了調度程序回調。 – 2010-06-14 17:29:11
您需要禁用「Just My Code」並顯示所有堆棧幀才能看到此內容。我建議你總是這樣做 - 通過WPF的堆棧跟蹤可以提供有關事情如何工作的有價值的線索。 – 2010-06-14 17:30:04