在ItemsControl中的多个项目上选择/复制文本

时间:2016-06-29 15:38:10

标签: c# wpf console emulation

我有一个“控制台模拟”,如下所示: https://stackoverflow.com/a/14957478/6518526

我的控制台中没有交互性,所以它实际上只是一个正在显示的缓冲区。

因此,ScrollViewer包含ItemsControl,其中包含TextBlocksItemsControl通过数据绑定获取其数据到包含字符串的可观察队列。

如何扩展此设置,以便可以像在控制台中一样选择/复制文本?

我已经尝试使用TextBox代替TextBlock,但这只是让我可以在每个项目中进行选择,但不能同时选择多个项目。

我在这里也找到了这个解决方案,它实现了一种使用数据绑定在FlowDocument中填充控件的方法:https://msdn.microsoft.com/en-us/magazine/dd569761.aspx。 但是看起来,这种方法也不会让我对几个项目进行选择。

所以,我几乎不知道哪种控件可用于实现这一目标的方式。

1 个答案:

答案 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>

您甚至不需要编写自己的上下文菜单。