2015-10-21 556 views
0

我有一個簡單的wpf應用程序,由3個文本框(tx1,tx2和tx3)組成。wpf禁用失去焦點

根據tx1的內容,我想禁用tx2或tx3。 我在tx1_LostFocus中執行此檢查,並將tx2.IsEnabled或tx3.IsEnabled設置爲False。

禁用tx3時全部正常工作,光標轉到tx2。

但禁用tx2結果不會在tx3中看到我的光標,它根本不可見。

我認爲問題的核心是在tx1_LostFocus中設置tx2.IsEnabled = False。我不得不在失去焦點的事件中這樣做。

任何線索?

+0

創建一個轉換器來完成這項工作 –

+0

你能提供更多的細節如何與做到這一點一個轉換器? – klawusel

+0

要使用'Converter'來做到這一點,你需要創建'AttachedProperty'來啓用''基於其他'TextBoxes'來禁用'TextBox'然後你可以使用'Converter'來使'Enabled' /''基於'condition'的'Disabled'。 –

回答

1

因此,我做了一些快速測試,看起來即使未啓用,控件也可以獲得焦點。我加在LostFocus事件處理這些線textOne

Debug.Print(b.Name + " lost focus."); 
Debug.Print("Disabling " + this.textTwo.Name); 

與該線路GotFocus事件處理程序textTwo

Debug.Print("Enabling " + this.textTwo.Name); 

您可以在輸出窗口看到,當我標籤拖出的textOne即使它被禁用,textTwo確實得到焦點:

textOne失去焦點。

禁用文本兩個

textTwo得到了重點。

我認爲最好的解決方案是在禁用控件後手動設置焦點。事情是這樣的:

if (testCondition) 
{ 
    tx2.IsEnabled = false; 
    tx3.Focus(); 
} 
else 
{ 
    tx3.IsEnabled = false; 
    tx2.Focus(); 
} 

更好的解決方案

我喜歡這個更好的解決方案,因爲它不脆。如果您重新排序控件或更改條件邏輯,則不會引入奇怪的Tab鍵行爲。在爲tx2GotFocus事件處理程序,您可以添加該代碼強制焦點移動到下一個控件,如果tx2被禁用:

if (!tx2.IsEnabled) 
{ 
    tx2.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); 
}; 
+0

感謝您的這個不錯的解決方案。

但我有另一個問題:
在上面的場景中,想象一下,我想根據tx1的內容禁用或啓用tx2。
說:tx1中的偶數應該禁用tx2,不均勻的數字應該啓用tx2。

- 現在,當我第一次在tx1中輸入「0」時,tx2被禁用並且焦點正確地轉到tx3。 - 現在我回到tx1並輸入「1」。我希望tx2變得可用,並將我的注意力集中到tx2,但它首先轉到tx3(tx2在離開tx1後啓用) – klawusel

+0

@klawusel - 我想這可能取決於何時啓用tx2。如果你在'tx1'失去焦點之後啓用它,那麼在這一點上可能太晚了。我可以想象焦點經理已經選擇'tx3'作爲下一個焦點目標(我的測試證實了這一點)。你能否在'tx1'失去焦點之前啓用/禁用你的控件。這將解決你所有的問題,我想。 –

+0

哪個事件在這一刻被解僱?我沒有找到驗證或類似的東西,並且PreviewLostFocus不起作用 – klawusel

0

使用tx3.Focus();當您需要在tx1_LostFocus的末尾將光標聚焦在它上面時。 如果tx3被禁用,不要忘記啓用tx2,反之亦然。

+0

問題是我有數千個來自vb6的例程,在那裏我沒有任何事情要做,但在tx1離開tx2以在tx3中自動獲取光標時禁用tx2! – klawusel

+0

也許提供給我們您的代碼將幫助我們找出它 –