我有一个“控制台模拟”,如下所示: https://stackoverflow.com/a/14957478/6518526
我的控制台中没有交互性,所以它实际上只是一个正在显示的缓冲区。
因此,ScrollViewer
包含ItemsControl
,其中包含TextBlocks
。 ItemsControl
通过数据绑定获取其数据到包含字符串的可观察队列。
如何扩展此设置,以便可以像在控制台中一样选择/复制文本?
我已经尝试使用TextBox
代替TextBlock
,但这只是让我可以在每个项目中进行选择,但不能同时选择多个项目。
我在这里也找到了这个解决方案,它实现了一种使用数据绑定在FlowDocument中填充控件的方法:https://msdn.microsoft.com/en-us/magazine/dd569761.aspx。 但是看起来,这种方法也不会让我对几个项目进行选择。
所以,我几乎不知道哪种控件可用于实现这一目标的方式。
答案 0 :(得分:0)
如果您想让用户从多行文本中选择并复制任意连续的字符子集,最简单的解决方案是多行TextBox
。在您的情况下,您将其设为只读。
如果您拥有足够大的行集合,这将陷入困境,但对于可管理的文本数量,它应该没问题。了解与您合作的案例的情况。
如果你想将文本作为一个集合来维护,如果是谨慎的行(在这种情况下听起来不错),你可以简单地编写一个属性,只要Lines
集合将这些行连接成一个字符串变化:
C#
public MyViewModel()
{
Lines = new ObservableCollection<String>();
}
private ObservableCollection<String> _lines;
public ObservableCollection<String> Lines
{
get { return _lines; }
protected set {
_lines = value;
UpdateText();
_lines.CollectionChanged += _lines_CollectionChanged;
OnPropertyChanged("Lines");
}
}
private void UpdateText()
{
Text = String.Join("\n", Lines);
}
private void _lines_CollectionChanged(object sender,
System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
UpdateText();
}
private string _text;
public String Text {
get { return _text; }
protected set {
_text = value;
OnPropertyChanged("Text");
}
}
XAML
<Grid>
<TextBox
Text="{Binding Text}"
TextWrapping="Wrap"
AcceptsReturn="True"
IsReadOnly="True"
/>
</Grid>
您甚至不需要编写自己的上下文菜单。