从 TextBlock 中删除 Environment.Newline 但不从 DataSource 中删除

OhB*_*ise 1 c# wpf xaml newline carriage-return

我正在创建一个 WPF 屏幕(使用 MVVM 模式),它显示ListViewin中的日志条目TextBlock,包括异常详细信息。

<GridViewColumn
    ListViewBehaviors:LayoutColumn.Width="1*"
    ListViewBehaviors:LayoutColumn.MinWidth="123"
    ListViewBehaviors:LayoutColumn.IsHidden="{Binding ExceptionDataIsHidden}"
    DisplayMemberBinding="{Binding ExceptionData, Mode=OneWay}"
    Header="Exception Data"/>
Run Code Online (Sandbox Code Playgroud)

由于记录数据的方式,异常字符串包含大量回车/换行符。例子:

System.BigBadException: Stuff blew up -> Some file location 
  at SomeMethodCallAtTheTopLevel: line 1234
  at SomeMethodCallAtTheNextLevel: line 123
  at SomeMethodCallAtAnotherLevel: line 12
  at SomeMethodCallOnBottomLevel: line 1
Run Code Online (Sandbox Code Playgroud)

有些例外情况可能相当大。当我的ListView. 这些字符并没有在一行上很好地显示每个条目,而是Environment.Newline强制每一行都是多行,从而导致用户在查看行条目时需要更多的滚动。

我意识到一个简单的解决方案是手动删除换行符,如下所示:

foreach (LogEntry entry in allEntries)
{
  entry.ExceptionData = entry.ExceptionData.Replace(Environment.NewLine, ""); 
}
Run Code Online (Sandbox Code Playgroud)

问题

我希望文本显示在GridViewColumn单元格中,就好像所有文本Newline都已被删除一样。但是,我想保留数据中的这些换行符。用户可以右键单击单元格并将其值复制到剪贴板。当粘贴到文件(例如记事本)中时,我希望存在换行符以使格式更易于阅读。

有没有办法忽略 xaml 中的换行符或通过其他方式? 或者我想吃掉我的蛋糕并把它也占有吗?

OhB*_*ise 5

我现在的解决方案是沿着与 K_Ram 讨论的思路。但是,我不想向我的ViewModel. 另外,我想要一个也适用于未来项目的通用解决方案。因此,我创建了一个简化的转换器类。

public class RemoveNewLineConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    var val = value as string ?? string.Empty;
    return val.Replace(Environment.NewLine, string.Empty);
  }

  public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    throw new NotImplementedException("Method not implemented");
  }
}
Run Code Online (Sandbox Code Playgroud)

那么,xaml 中的用法很简单:

xmlns:Converters="clr-namespace:MyWpfHelpers.Converters;assembly=MyWpfHelpers"

<UserControl.Resources>
    <ResourceDictionary>
        <Converters:RemoveNewLineConverter x:Key="NoNewline"/>
    </ResourceDictionary>
</UserControl.Resources>

<GridViewColumn
    ListViewBehaviors:LayoutColumn.Width="1*"
    ListViewBehaviors:LayoutColumn.MinWidth="123"
    ListViewBehaviors:LayoutColumn.IsHidden="{Binding ExceptionDataIsHidden}"
    DisplayMemberBinding="{Binding ExceptionData, Mode=OneWay, Converter={StaticResource NoNewline}}"
    Header="Exception Data"/>
Run Code Online (Sandbox Code Playgroud)