2010-11-11 55 views
0

我和許多人一樣需要在WPF中創建一個數字文本框控件。到目前爲止,我已經取得了很好的進展,但我不確定下一步採取什麼正確的方法。如何強制子文本文本框的值?

作爲控件規範的一部分,它必須總是顯示一個數字。如果用戶突出顯示所有文本並點擊退格或刪除,我需要確保該值設置爲零,而不是「空白」。我應該如何在WPF控件模型中執行此操作?

我迄今(略):

public class PositiveIntegerTextBox : TextBox 
{ 
    protected override void OnPreviewTextInput(System.Windows.Input.TextCompositionEventArgs e) 
    { 
     // Ensure typed characters are numeric 
    } 

    protected override void OnPreviewDrop(DragEventArgs e) 
    { 
     // Ensure the dropped text is numeric. 
    } 

    protected override void OnTextChanged(TextChangedEventArgs e) 
    { 
     if (this.Text == string.Empty) 
     { 
      this.Text = "0"; 
      // Setting the Text will fire OnTextChanged again-- 
      // Set Handled so all the other handlers only get called once. 
      e.Handled = true; 
     } 

     base.OnTextChanged(e); 
    } 

    private void HandlePreviewExecutedHandler(object sender, ExecutedRoutedEventArgs e) 
    { 
     // If something's being pasted, make sure it's numeric 
    } 
} 

,一方面,這很簡單,似乎工作確定。我不確定這是否正確,因爲我們總是(如果有的話)簡短地將文本設置爲空白,然後將其重置爲零。沒有PreviewTextChanged事件可以讓我在改變它之前操縱它,所以這是我最好的猜測。

它是正確的嗎?

回答

0

爲什麼就不能利用你OnPreviewTextInput處理程序的檢查,如果輸入的值是一個int與否,試圖將其轉換...

Convert.ToInt32(e.Text); 

如果轉換失敗,它不是一個int和因此將其標記爲已處理,以便文本不會更改。雖然這可能會略微違反你的需要,即...刪除所有文本不會恢復到0,但它仍然是一個整數。我個人認爲,從用戶界面的角度來看,這更合乎邏輯,爲什麼清除所有輸入將值移到0?這自身定義了TextBox接受非int值,因爲UI在這些條件下發生了變化。

+0

不幸的是,這並不那麼簡單。 OnPreviewTextInput僅在文本輸入時觸發。如果輕擊空格鍵,則不會觸發,例如,或者如果選擇了文字並輕擊刪除或退格鍵。 – 2010-11-11 15:00:08

+0

然後,您可以根據需要吞下原始的按鍵筆畫...您是否檢查過此... http://msdn.microsoft.com/en-us/library/ms229644(VS.80).aspx – 2010-11-11 15:04:23

+0

是啊,但感謝鏈接都一樣。 :)幸運的是,我的特定場景允許將我的框限制爲PositiveIntegerTextBox。如果我不得不支持小數/負數,我必須去那裏。 (根據我的情況,在粘貼和拖放的完整場景中,事情變得非常醜陋)。 – 2010-11-11 15:12:38