0

设想:

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

问题:

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

已经尝试过:

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

问题:

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

4

2 回答 2

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>
于 2013-05-23T09:45:02.043 回答
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()); 
}
于 2017-01-11T02:20:10.050 回答