元素的布局测量覆盖不应返回 NaN 值作为其 DesiredSize

Vin*_*ins 5 .net printing wpf

Measure当我尝试调用动态计算的大小并将其传递给该方法时,我遇到了类似的问题:

元素“System.Windows.Controls.StackPanel”的布局测量覆盖不应返回 NaN 值作为其 DesiredSize。

我正在尝试动态创建一个 StackPanel 并打印它。这是我的代码:

StackPanel printPanel = new StackPanel();

PrintableArea.Children.Remove(ChartBorder);
printPanel.Children.Add(ChartBorder);

//Get selected printer capabilities
System.Printing.PrintCapabilities capabilities = dialog.PrintQueue.GetPrintCapabilities(dialog.PrintTicket);

//Get scale of the print wrt to screen of visual
double scale = Math.Min(capabilities.PageImageableArea.ExtentWidth / printPanel.ActualWidth, capabilities.PageImageableArea.ExtentHeight / printPanel.ActualHeight);

//Transform the Visual to scale
printPanel.LayoutTransform = new ScaleTransform(scale, scale);

//Get the size of the printer page
Size sz = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);

//Update the layout of the visual to the printer page size.
printPanel.Measure(sz);
printPanel.Arrange(new Rect(new Point(capabilities.PageImageableArea.OriginWidth, capabilities.PageImageableArea.OriginHeight), sz));

dialog.PrintVisual(printPanel, "Test");
Run Code Online (Sandbox Code Playgroud)

任何线索可能是什么原因造成的?奇怪的是,这种情况只发生在StackPanel. 如果我尝试创建一个简单的TextBlock测试目的并尝试打印它,则一切正常,没有错误。我想知道我们打电话时有什么Measure不同StackPanel

任何解决这个问题的帮助都会非常好!

Cod*_*ked 3

您可能将 Size(double.NaN, double.NaN) 传递给 Measure 调用,这很糟糕。您的 printPanel.ActualWidth/ActualHeight 应为 0.0,这会导致 NaN。这是 Double 定义 NaN 的方式:

   public const double NaN = (double) 0.0 / (double) 0.0;
Run Code Online (Sandbox Code Playgroud)

因此,您需要传入 Size(double.PositiveInfinity, double.PositiveInfinity) 才能获得所需的大小。安排 printPanel 后,ActualWidth/ActualHeight 应该有效。

  • 感谢您的答复。经过研究,我发现我需要设置 MinHeight、MinWidth、MaxHeight 和 MaxWidth。一旦我这样做了,我的 printPanel 就获得了所需的大小,我可以在其上调用 Measure 和 Arrange 方法。 (2认同)