在WPF数据网格行或单元格中选择任意文本并进行复制

时间:2013-05-23 09:25:56

标签: wpf datagrid copy-paste

情景:

我有一个包含日志事件的ObservableCollection。日志事件包括例如时间,日期,严重程度和消息。我正在使用带有数据绑定的WPF数据网格来显示ObservableCollection的内容。

问题:

作为最终用户,我想在一行中标记/选择任意数量的文本并将其复制到剪贴板。举个例子,我想在消息列或整行中选择单个单词,就像在excel或html渲染表中一样。

已经尝试过:

我试图将单元格的模板更改为只读文本框,这样可以标记整个单元格或单个单词,但选择并复制整行不再有效。 我还考虑使用“FlowDocument”控件,但UI的一个主要功能是添加新的日志消息而不重新绘制整个控件。据我所知,FlowDocument也无法实现这一点,而FlowDocument也缺乏数据绑定支持。

问题:

如何在WPF中显示(例如)日志事件的列表,其中可以选择和复制任意文本部分,就像在Excel或渲染的html表中一样?

2 个答案:

答案 0 :(得分:1)

可以试试这个属性:

<DataGrid SelectionUnit="Cell">

<强>增加:

<DataGrid ItemsSource="{x:Static Fonts.SystemFontFamilies}" SelectionUnit="Cell" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Mode=OneWay}"/>
        <DataGridTextColumn Binding="{Binding Baseline}"/>
        <DataGridTextColumn Binding="{Binding LineSpacing}" Width="*"/>
    </DataGrid.Columns>
</DataGrid>

答案 1 :(得分:1)

一次选择整行并复制到剪贴板

<DataGrid ... SelectionUnit="FullRow" CopyingRowClipboardContent="dataPaths_CopyingRowClipboardContent">

呼叫

private void dataPaths_CopyingRowClipboardContent(object sender, DataGridRowClipboardEventArgs e)
{
   IList<DataGridCellInfo> cells = (sender as DataGrid).SelectedCells;

   foreach (DataGridCellInfo cell in cells)
       e.ClipboardRowContent.Add(new DataGridClipboardCellContent(e.Item, cell.Column, null));

   //or write out to a log
   foreach (var row in e.ClipboardRowContent)
      Console.WriteLine(row.Item.toString()); 
}