Для управления WPF действительно ли возможно иметь ActualWidth и ActualHeight, если это никогда не представлялось?

Мне нужен a Viewport3D для единственной цели сделать геометрическое использование вычислений Petzold.Media3D.ViewportInfo. Я предпочел бы не должным быть помещать его в a Window или иначе представьте его.

Я пытаюсь выполнить это путем инстанцирования a Viewport3D и установка нескольких свойств с помощью следующего метода C#:

private Viewport3D CreateViewport(MainSettings settings)
{
    var cameraPosition = new Point3D(0, 0, settings.CameraHeight);
    var cameraLookDirection = new Vector3D(0, 0, -1);
    var cameraUpDirection = new Vector3D(0, 1, 0);
    var camera = new PerspectiveCamera
    {
        Position = cameraPosition,
        LookDirection = cameraLookDirection,
        UpDirection = cameraUpDirection
    };
    var viewport = new Viewport3D
    {
        Camera = camera,
        Width = settings.ViewportWidth,
        Height = settings.ViewportHeight
    };
    return viewport;
}

Позже, я пытаюсь использовать эту область просмотра для преобразования местоположения мыши в 3D местоположение с помощью этого метода:

public Point3D? Point2dToPoint3d(Point point)
{
    var range = new LineRange();
    var isValid = ViewportInfo.Point2DtoPoint3D(_viewport, point, out range);
    if (isValid)
        return range.PointFromZ(0);
    else
        return null;
}

К сожалению, это не работает. Я думаю, что причина состоит в том что ActualWidth и ActualHeight из области просмотра и нуль (и это свойства только для чтения, таким образом, я не могу установить их вручную). (Отметьте: Я протестировал тот же самый метод с представленным фактическим Viewport3D, и это хорошо работало, таким образом, я знаю, что проблема не с моим методом преобразователя.)

Любая идея, как я могу заставить WPF присваиваться ActualWidth и ActualHeight из управления на основе Width и Height настройки?

Я пытался установить HorizontalAlignment и VerticalAlignment кому: Left и Top, соответственно, и я также смешал с MinWidth и MinHeight, но ни одно из этих свойств не имело эффекта на ActualWidth или ActualHeight.

5
задан Dave Clemmer 13 June 2013 в 16:10
поделиться

1 ответ

Из темы MSDN для свойства ActualWidth :

Это свойство представляет собой вычисленное значение на основе других входных значений ширины и системы макета. Значение устанавливается самой системой макета на основе фактического прохода рендеринга , и поэтому может немного отставать от установленного значения свойств, таких как Ширина, которые являются основой изменения ввода.

Итак, похоже, что для установки свойства необходим проход отрисовки. Однако вы можете попробовать вызвать Measure (Size) , а затем Arrange (Rect) , чтобы смоделировать процесс компоновки. Может быть, этого уже достаточно.

5
ответ дан 14 December 2019 в 19:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: