TextBlock上面有一段文本,可以做到选中复制,就像网页上面的文字,鼠标一划,就可以选中复制这句话。
因为textblock并没有支持支持的selectXXX相关事件,所以要实现你的效果可以通过鼠标事件来处理,例如:
1.定义事件
this._textblock.PreviewMouseLeftButtonDown += _textblock_PreviewMouseLeftButtonDown; this._textblock.PreviewMouseLeftButtonUp += _textblock_PreviewMouseLeftButtonUp;
2.事件处理
Point _startMousePosition;
TextPointer _startPt;
void _textblock_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) { Point lastMousePosition = e.GetPosition(this._textblock); TextPointer tp = this._textblock.GetPositionFromPoint(lastMousePosition, true); TextRange tr = new TextRange(_startPt, tp); string seltext = tr.Text; MessageBox.Show(seltext); } void _textblock_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { _startMousePosition = e.GetPosition(this._textblock); _startPt = this._textblock.GetPositionFromPoint(_startMousePosition, true); }
实现了文本的选择接下来就是你自己的复制操作了,但是这种做法存在一个问题就是你无法直接看到类似网页那种选中文本的效果(例如textbox选择文本时候有遮罩的效果),要解决这个问题你可以使用装饰器来做个"选择文本时候遮罩的效果”
以上是基于textBlock的,我觉得为了避免很多不要的处理,可以考虑直接重写textbox来实现你的需求,这样会简单很多,textbox和textblock一个很大的区别其实就是一个支持编辑一个不支持直接编辑而已
嗯,懂了,多谢了,非常感谢你的回答。
同楼上说的用 TexBox 替代,不过不用重写,设置 ReadOnly 属性就行了
也很感谢你的回答。我首先考虑textblock是因为它里面的字体可以用多种颜色。