从 TextBlock 但不是从 DataSource 中删除 Environment.Newline
Remove Environment.Newline from TextBlock but not from DataSource
我正在创建一个 WPF 屏幕(使用 MVVM 模式),它在 TextBlock
中的 ListView
中显示日志条目,包括异常详细信息。
<GridViewColumn
ListViewBehaviors:LayoutColumn.Width="1*"
ListViewBehaviors:LayoutColumn.MinWidth="123"
ListViewBehaviors:LayoutColumn.IsHidden="{Binding ExceptionDataIsHidden}"
DisplayMemberBinding="{Binding ExceptionData, Mode=OneWay}"
Header="Exception Data"/>
由于记录数据的方式,异常字符串包括大量回车符 returns / 换行符。示例:
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
单元格中,就像所有 Newline
都已被删除一样。但是,我想在数据中保留这些换行符。用户可以右键单击单元格并将其值复制到剪贴板。粘贴到文件(例如记事本)时,我希望出现换行符以使格式更易于阅读。
有没有办法忽略 xaml 中的换行符或其他方法? 还是我想吃我的蛋糕也想吃?
如果我对你的问题的理解正确,你可以创建一个隐藏字段来保存原始数据并使用一个字段进行显示。或者使用完全不同的显示模型。在某处保存您的原始数据。
截取 right-click/copy 事件——如果您还没有创建自己的事件——并替换所需的原始数据。
我现在的解决方案与 K_Ram 的讨论一致。但是,我不想在我的 ViewModel
中再添加一个 属性。此外,我想要一个也适用于未来项目的通用解决方案。因此我创建了一个简化的转换器 class.
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"/>
我正在创建一个 WPF 屏幕(使用 MVVM 模式),它在 TextBlock
中的 ListView
中显示日志条目,包括异常详细信息。
<GridViewColumn
ListViewBehaviors:LayoutColumn.Width="1*"
ListViewBehaviors:LayoutColumn.MinWidth="123"
ListViewBehaviors:LayoutColumn.IsHidden="{Binding ExceptionDataIsHidden}"
DisplayMemberBinding="{Binding ExceptionData, Mode=OneWay}"
Header="Exception Data"/>
由于记录数据的方式,异常字符串包括大量回车符 returns / 换行符。示例:
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
单元格中,就像所有 Newline
都已被删除一样。但是,我想在数据中保留这些换行符。用户可以右键单击单元格并将其值复制到剪贴板。粘贴到文件(例如记事本)时,我希望出现换行符以使格式更易于阅读。
有没有办法忽略 xaml 中的换行符或其他方法? 还是我想吃我的蛋糕也想吃?
如果我对你的问题的理解正确,你可以创建一个隐藏字段来保存原始数据并使用一个字段进行显示。或者使用完全不同的显示模型。在某处保存您的原始数据。
截取 right-click/copy 事件——如果您还没有创建自己的事件——并替换所需的原始数据。
我现在的解决方案与 K_Ram 的讨论一致。但是,我不想在我的 ViewModel
中再添加一个 属性。此外,我想要一个也适用于未来项目的通用解决方案。因此我创建了一个简化的转换器 class.
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"/>