Gardes Asked:2020-01-27 21:46:42 +0000 UTC2020-01-27 21:46:42 +0000 UTC 2020-01-27 21:46:42 +0000 UTC TextBlock 中的指数书写 772 DataGridTextColumn当没有足够的空间来完整显示数字时,如何实现向指数表示法的过渡。 期望的效果: 有一个想法是使用转换器,并在每次列宽更改时调用它。在转换器中使用StringFormat. 出现其他问题: 应该订阅什么事件来跟踪列大小的变化? 如何确定一个单元格中可以容纳多少个字符,以便知道在逗号之后和之前显示多少个字符E? TextTrimming="CharacterEllipsis"PS TextBlock属性做类似的事情。如果没有足够的空间显示,一些字符被省略号代替。如果您了解 TextBlock 如何确定它没有足够的空间来显示文本,那么它可能会解决这个问题。 c# 1 个回答 Voted Best Answer VladD 2020-03-11T08:47:04Z2020-03-11T08:47:04Z 理论上,UserControl一点代码隐藏也可以适用于此。要测量不显示的文本宽度,该类是合适的FormattedText。这是一个简单的草图: 控制: <UserControl x:Class="Test.DoubleWidthFitControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <TextBlock Name="Target" HorizontalAlignment="Right"/> </UserControl> 代码隐藏: public partial class DoubleWidthFitControl : UserControl { public DoubleWidthFitControl() { InitializeComponent(); SizeChanged += (o, args) => Recalc(); } #region dp double Value public double Value { get { return (double)GetValue(ValueProperty); } set { SetValue(ValueProperty, value); } } public static readonly DependencyProperty ValueProperty = DependencyProperty.Register( "Value", typeof(double), typeof(DoubleWidthFitControl), new PropertyMetadata(0.0, (o, args) => ((DoubleWidthFitControl)o).Recalc())); #endregion void Recalc() { var targetWidth = ActualWidth; var num = Value; string s; // у C# 7 есть локальные функции, вау! bool CheckLength(string format) { s = num.ToString(format); return Measure(s) <= targetWidth; } if (CheckLength("F") || CheckLength("G")) { Target.Text = s; return; } int i; for (i = 0; CheckLength($"E{i}"); i++) /**/; if (i == 0) Target.Text = "###"; else Target.Text = num.ToString($"E{i - 1}"); } double Measure(string s) { TextBlock tb = Target; var formattedText = new FormattedText( s, CultureInfo.CurrentCulture, tb.FlowDirection, new Typeface(tb.FontFamily, tb.FontStyle, tb.FontWeight, tb.FontStretch), tb.FontSize, Brushes.Black); return formattedText.Width; } } 便于使用: <local:DoubleWidthFitControl Value="10000000000" /> 结果: 有进一步优化的良好潜力。例如,对于给定的字符串和字体,您可以一次计算并记住显示选项及其大小,然后简单地选择适合的最大选项。
理论上,
UserControl一点代码隐藏也可以适用于此。要测量不显示的文本宽度,该类是合适的FormattedText。这是一个简单的草图:控制:
代码隐藏:
便于使用:
结果:
有进一步优化的良好潜力。例如,对于给定的字符串和字体,您可以一次计算并记住显示选项及其大小,然后简单地选择适合的最大选项。