我正在创建一个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中的换行符或其他方法? 或者我是否想要吃我的蛋糕呢?
答案 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)
如果我正确理解您的问题,您可以创建一个隐藏字段来保存原始数据并使用字段进行显示。或者使用完全不同的显示模型。保留原始数据。
拦截右键单击/复制事件 - 如果您还没有,可以创建自己的 - 并替换所需的原始数据。