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?
任何解决这个问题的帮助都会非常好!
您可能将 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 应该有效。
| 归档时间: |
|
| 查看次数: |
4949 次 |
| 最近记录: |