我已經在每個單元格中創建了一個帶有可編輯文本塊的自定義網格控件。通過雙擊觸發編輯,如下所示:無法弄清楚爲什麼控件失去焦點
void TextBlock_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
if (e.ClickCount == 2) Edit();
}
public void Edit()
{
TextBox.Text = TextBlock.Text;
TextBlock.Visibility = System.Windows.Visibility.Collapsed;
TextBox.Visibility = System.Windows.Visibility.Visible;
Dispatcher.BeginInvoke((ThreadStart)delegate
{
TextBox.Focus();
TextBox.SelectAll();
});
}
該零件按預期工作。
我希望讓用戶能夠通過按Tab鍵前進或移動標籤返回來爲下一個單元格添加標籤。我說這是引發像這樣的事件:
void TextBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
if (e.Key == System.Windows.Input.Key.Tab)
{
e.Handled = true;
OnTab(System.Windows.Input.Keyboard.IsKeyDown(System.Windows.Input.Key.LeftShift) || System.Windows.Input.Keyboard.IsKeyDown(System.Windows.Input.Key.RightShift));
}
}
外網處理這一事件,並呼籲一個或下一個可編輯單元的Edit()
方法。這與預期的幾乎一樣,只要我實際上沒有在文本框中輸入。出於某種原因,如果我輸入了任何內容,則LostFocus事件不僅會觸發當前單元格(預期在Edit()
在文本框中調用Focus()
之後),還會觸發下一個單元格。以下是LostFocus事件的代碼。 (雖然我敢肯定這是不相關的。)
void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
bool TextChanged = TextBox.Text != TextBlock.Text;
TextBlock.Text = TextBox.Text;
TextBlock.Visibility = System.Windows.Visibility.Visible;
TextBox.Visibility = System.Windows.Visibility.Collapsed;
if (TextChanged) OnTextChanged();
}
我可以建立某種形式的花哨的門拿到文本框忽略此事件,但我,爲什麼它甚至射擊更加好奇,或在至少我怎麼能找到答案。
謝謝。
編輯:
因此很明顯,即使有一些門,我還是大清洗。我添加了一個叫布爾和Editing
改變了Edit()
方法是這樣的工作:
public void Edit()
{
TextBox.Text = TextBlock.Text;
TextBlock.Visibility = System.Windows.Visibility.Collapsed;
TextBox.Visibility = System.Windows.Visibility.Visible;
Thread Task = new Thread(() =>
{
Editing = true;
Dispatcher.BeginInvoke((ThreadStart)delegate
{
System.Windows.Input.Keyboard.Focus(TextBox);
TextBox.SelectAll();
EditGate.Set();
});
EditGate.WaitOne();
Editing = false;
});
Task.Start();
}
再變引發LostFocus處理程序:
void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
if (Editing) return;
// ... Some more code.
}
不幸的是這也不起作用。事情最終會像這樣:
- 當前單元格:編輯開始了假
- 當前單元格:標籤事件觸發
- 下一小區:編輯()稱爲
- 下一小區:編輯設置爲True
- 下一小區:EditGate.WaitOne()稱爲
- 下一小區:Keyboard.Focus()稱爲
- 當前單元格:聚焦丟失(編輯還是假的)
- 下一小區:Textbox.SelectAll()稱爲
- 下一小區:EditGate.Set()稱爲
- 下一小區:編輯設置爲False
- 下一小區:聚焦丟失(編輯現在是假的)
我不確定爲什麼LostFocus事件會在之後發射。這幾乎就像它知道我在做什麼。:P
是否有焦點調用線程和調用特定的原因是什麼? – 2013-02-12 03:10:01
@ sa_ddam213 - 是的,因爲如果它沒有被調用,它什麼也不做。不知道爲什麼。 – 2013-02-12 03:14:11