我有一个显示文字的TextBlock
。当用户点击文本时,它会被TextBox
(绑定到相同数据)动态替换,有效地切换到“编辑模式”。这也显着提高了性能。
唯一需要注意的是,我无法知道用户点击的文本部分。因此,光标始终显示在TextBox
的第一个位置。理想情况下,光标应出现在用户单击的相同文本位置。
答案 0 :(得分:1)
试试这个:
LockedTextBoxStyle
的样式
IsKeyboardFocused
创建触发器
如果为true,则将样式设置为LockedTextBoxStyle
由于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;
}