2010-12-19 38 views

回答

0

大多數文本控件都會有KeyDownKeyUp事件,您可以使用它們查找按下的按鍵。

我已經鏈接到winforms TextBox,因爲您沒有指定使用哪種技術。

但是,沒有直接的方法可以判斷光標在字段內的位置。

+0

我正在寫c#.net4我已經處理了上/下home/end pageup/pagedown部分,並且我看到有滾動條movment的事件 – igal 2010-12-19 19:08:18

+0

@igal - winforms,webforms或WPF? – Oded 2010-12-19 19:10:00

0

我不確定SelectionChanged事件是否觸發了插入符號位置上的evon,但您應該嘗試一下。

如果沒有,您可以創建一個計時器並檢查SelectionStart屬性值是否更改。

更新:這是相當簡單的創建一個文本框類,它提出了一個SelectionChanged事件:

public class TextBoxEx : TextBox 
{ 

    #region SelectionChanged Event 

    public event EventHandler SelectionChanged; 

    private int lastSelectionStart; 
    private int lastSelectionLength; 
    private string lastSelectedText; 
    private void RaiseSelectionChanged() 
    { 
     if (this.SelectionStart != lastSelectionStart || this.SelectionLength != lastSelectionLength || this.SelectedText != lastSelectedText) 
      OnSelectionChanged(); 

     lastSelectionStart = this.SelectionStart; 
     lastSelectionLength = this.SelectionLength; 
     lastSelectedText = this.SelectedText; 
    } 

    protected virtual void OnSelectionChanged() 
    { 
     var eh = SelectionChanged; 
     if (eh != null) 
     { 
      eh(this, EventArgs.Empty); 
     } 
    } 

    #endregion 

    protected override void OnKeyDown(KeyEventArgs e) 
    { 
     base.OnKeyDown(e); 
     RaiseSelectionChanged(); 
    } 

    protected override void OnKeyUp(KeyEventArgs e) 
    { 
     base.OnKeyUp(e); 
     RaiseSelectionChanged(); 
    } 

    protected override void OnMouseDown(MouseEventArgs e) 
    { 
     base.OnMouseDown(e); 
     RaiseSelectionChanged(); 
    } 

    protected override void OnMouseUp(MouseEventArgs mevent) 
    { 
     base.OnMouseUp(mevent); 
     RaiseSelectionChanged(); 
    } 

} 
+0

SelectionChanged不針對Windows窗體觸發 – Abel 2011-11-21 08:26:00

+0

@Abel,那是真的,我剛剛用一個引發SelectionChanged事件的TextBox更新了我的帖子。 – 2011-11-21 14:39:37

2

本地的Windows控件不產生通知這一點。試圖解決這個限制是一個痛苦的祕訣,你只是無法分辨脫字符的位置。 SelectionStart屬性是而不是的可靠指標,插入符號可以出現在選擇的任一端,具體取決於用戶選擇文本的方向。拼寫檢查GetCaretPos()在控件具有焦點時給出插入位置,但由於TextRenderer.MeasureText()中的不準確,將它映射回字符索引並不容易。

不要去那裏。相反,解釋你爲什麼認爲你需要這個。

2

希望這會有所幫助。我在鼠標移動上做了這件事

private void txtTest_MouseMove(object sender, MouseEventArgs e) 
{ 
    string str = "Character{0} is at Position{1}"; 
    Point pt = txtTest.PointToClient(Control.MousePosition); 
    MessageBox.Show(
     string.Format(str 
     , txtTest.GetCharFromPosition(pt).ToString() 
     , txtTest.GetCharIndexFromPosition(pt).ToString()) 
    ); 
} 
相關問題