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

时间:2015-03-25 16:58:46

标签: c# wpf xaml newline carriage-return

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

TextBlock

由于记录数据的方式,异常字符串包括许多回车/换行符。例如:

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

有些例外可能非常大。将条目显示为System.BigBadException: Stuff blew up -> Some file location at SomeMethodCallAtTheTopLevel: line 1234 at SomeMethodCallAtTheNextLevel: line 123 at SomeMethodCallAtAnotherLevel: line 12 at SomeMethodCallOnBottomLevel: line 1 中的行时,这会成为问题。 ListView字符不是很好地在一行上显示每个条目,而是强制每一行为多行,从而在查看行条目时使用户滚动更多。

我意识到一个简单的解决方案就是手动删除换行符:

Environment.Newline

问题

我希望文本显示在foreach (LogEntry entry in allEntries) { entry.ExceptionData = entry.ExceptionData.Replace(Environment.NewLine, ""); } 单元格中,就好像已删除所有GridViewColumn一样。但是,我想在数据中保留这些换行符。用户可以右键单击一个单元格并将其值复制到剪贴板。粘贴到文件(比如记事本)时,我希望存在换行符,以便更容易阅读格式。

有没有办法忽略xaml中的换行符或其他方法? 或者我是否想要吃我的蛋糕呢?

2 个答案:

答案 0 :(得分:3)

我现在的解决方案与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");
  }
}

然后,在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"/>

答案 1 :(得分:1)

如果我正确理解您的问题,您可以创建一个隐藏字段来保存原始数据并使用字段进行显示。或者使用完全不同的显示模型。保留原始数据。

拦截右键单击/复制事件 - 如果您还没有,可以创建自己的 - 并替换所需的原始数据。