Переопределение измерения макета элемента не должно возвращать значения NaN как его DesiredSize - PullRequest
3 голосов
/ 11 марта 2011

Я столкнулся с подобной проблемой, когда я пытаюсь вызвать 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?

Любая помощь, чтобы решить эту проблему, была бы очень полезна!

1 Ответ

2 голосов
/ 11 марта 2011

Вы, вероятно, передаете размер (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 должны быть действительными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...