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

问题描述 投票:0回答:2

当我尝试调用

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");

有知道这可能是什么原因吗?奇怪的是,这种情况只发生在

StackPanel
身上。如果我尝试创建一个简单的
TextBlock
进行测试并尝试打印它,一切都会正常工作,没有错误。我想知道当我们称呼
Measure
StackPanel
时有什么不同?

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

.net wpf printing
2个回答
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;

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


0
投票
'System.InvalidOperationException: Override layout unit for element 
'System.Windows.Controls.Border' should not return NaN value to DesiredSize.'

我遇到过这个错误。除了边框之外,几乎是一样的。

我找到了 DesiredSize 的 NaN 值不再出现的解决方案。我已将 LibVLCSharp 版本从 3.8.2 降级到 3.6.6

  <package id="LibVLCSharp" version="3.6.6" targetFramework="net48" />
  <package id="LibVLCSharp.Forms" version="3.6.6" targetFramework="net48" />
  <package id="LibVLCSharp.Forms.WPF" version="3.6.6" targetFramework="net48" />
  <package id="LibVLCSharp.WPF" version="3.6.6" targetFramework="net48" />

VS 社区 22 -> 工具 -> NuGet 包管理器 -> NuGet 解决方案: 您可以在那里升级或降级 NuGet 软件包。

© www.soinside.com 2019 - 2024. All rights reserved.