如何知道用户在WPF TextBlock中单击了哪个字母

时间:2010-07-15 07:17:00

标签: c# wpf

我有一个显示文字的TextBlock。当用户点击文本时,它会被TextBox(绑定到相同数据)动态替换,有效地切换到“编辑模式”。这也显着提高了性能。

唯一需要注意的是,我无法知道用户点击的文本部分。因此,光标始终显示在TextBox的第一个位置。理想情况下,光标应出现在用户单击的相同文本位置。

3 个答案:

答案 0 :(得分:1)

试试这个:

  1. 创建一个TextBox
  2. 创建名为LockedTextBoxStyle的样式
    • BorderThickness:0
    • IsReadOnly:True
    • IsReadOnlyCaretVisible:True
    • 光标:箭头
  3. IsKeyboardFocused创建触发器   如果为true,则将样式设置为LockedTextBoxStyle
  4. 由于IsReadOnlyCaretVisible设置为true,我希望这会保留插入位置。还没有测试过。

答案 1 :(得分:1)

显然,解决方案非常简单明了。但是,它仍然使用TextBox而不是TextBlock。以下方法从鼠标单击事件和触发事件的TextBox接收MouseButtonEventArgs并返回用户单击的文本索引。

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

答案 2 :(得分: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;

}