2010-07-15 59 views
2

我有一個TextBlock提供了一個文本。當用戶點擊文本時,它會被一個TextBox(綁定到相同的數據)動態替換,從而有效切換到「編輯模式」。這也顯着改善了性能。如何知道用戶在WPF TextBlock中點擊了哪個字母

唯一需要注意的是,我無法知道用戶點擊了哪部分文字。因此,光標總是出現在TextBox的第一個位置。理想情況下,光標應該出現在用戶點擊的相同文本位置。

+0

有趣的是,這是Visual Studio選擇不解決的問題。如果您在解決方案資源管理器中單擊突出顯示的文件名(允許您重命名該文件),則文本將突出顯示,這意味着您現在需要再次在文本框內單擊以放置插入符號。如果你沒有得到你的問題的答案,也許這可能是一個解決方法? – kiwipom 2010-07-15 08:07:30

回答

1

值得注意的是,解決方案非常簡單直接。但是,它仍然使用TextBox而不是TextBlock。以下方法從鼠標單擊事件和觸發事件的TextBox接收MouseButtonEventArgs,並返回用戶單擊的文本索引。

private int GetMouseClickPosition(MouseButtonEventArgs mouseButtonEventArgs, 
            TextBox textBox1) 
    { 
     Point mouseDownPoint = mouseButtonEventArgs.GetPosition(textBox1); 
     return textBox1.GetCharacterIndexFromPoint(mouseDownPoint, true); 
    } 
1

試試這個:

  1. 創建一個文本框
  2. 創建一個名爲LockedTextBoxStyle
    • 了borderThickness樣式:0
    • IsReadOnly:真
    • IsReadOnlyCaretVisible:真
    • 光標:箭頭
  3. IsKeyboardFocused 當真正的一套風格創建觸發器LockedTextBoxStyle

由於IsReadOnlyCaretVisible設置爲true,我希望會保持插入位置。還沒有測試過。

+0

解決方案運行良好,但它需要在只讀模式下使用「TextBox」而不是「TextBlock」,因此會降低性能。 如果我找不到其他方法,那麼您的解決方案是一個很好的選擇,謝謝。 順便說一下,'TextBox.IsReadOnlyCaretVisible'是一個.Net 4.0功能。 – Elad 2010-07-15 13:28:30

+0

@Elad:不知道使用「TextBlock」可以獲得什麼樣的表現。可能是你使用了大量的TextBlocks。 – Amsakanna 2010-07-15 17:48:51

0

有點晚,但我同樣的問題摔跤,這是我想出了一個解決方案,原油雖然它可能是,它似乎只是很好地工作:

<Window x:Class="MyWindow.MainWindow" 
... 
... 
<TextBlock MouseLeftButtonUp="TextBlock_OnMouseLeftButtonUp">Here is some Text</TextBlock> 
<TextBox Name="TextBox1" Width="150"></TextBox> 

然後,在後面的代碼中:

private void TextBlock_OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    TextBlock tb = sender as TextBlock; 
    TextPointer tp = tb.GetPositionFromPoint(e.GetPosition(tb), false); 

    int index = tp.GetLineStartPosition(0).GetOffsetToPosition(tp) - 1; 

    TextBox1.Text = tb.Text; 
    TextBox1.Focus(); 
    TextBox1.CaretIndex = index; 

} 
相關問題