Изменение размера представления по размеру путем установки высоты и ширины в коде не обновляется правильно - PullRequest
0 голосов
/ 26 марта 2019

В моем приложении у нас есть представление, содержащее несколько вложенных представлений, для обеспечения некоторых общих функций, т. Е.

В этом случае:

ErrorPanelView (UserControl) с основной ячейкой сетки размера * и ячейкой фиксированной ширины, которая содержит панель сообщений проверки (если проверка не удалась) - эта панель имеет фиксированную ширину и при необходимости отображается или сворачивается .

Основное содержимое снова содержит ButtonPanelView с ячейкой сетки размера * и ячейкой фиксированной высоты, в которой содержатся стандартные кнопки (ок, отмена и т. Д.)

Основное содержимое затем содержит «фактическое» представление - оно может иметь значения min / maxHeight и min / maxWidth, для этого примера значения min / max одинаковы, поэтому размер является статическим.

Когда представление имеет ошибку проверки, и панель validationPanel становится видимой. Общий вид изменится (увеличится по ширине), как и положено, так что пока все хорошо. Однако, когда ошибки проверки обрабатываются пользователем, панель проверки должна исчезнуть, а размер окна должен уменьшиться до его первоначального размера. Что происходит, так это то, что внутренние представления изменят размер правильно (так кажется, по крайней мере), но внешнее представление (пользовательский контроль ErrorPanelView) сохранит свои большие размеры и оставит черное поле, где панель проверки была видна ранее.

В тот момент, когда пользователь нажимает на usercontrol, userControl привязывается к своему предполагаемому (оригинальному) размеру.

enter image description here

Я не могу понять, чего мне здесь не хватает.

Насколько я могу судить, размеры рассчитаны правильно, а высота и ширина UserControl установлены на правильные значения, но что-то не так с последовательностью? - или я должен явно вызвать какой-то systemEvent?

или что-то еще совсем ??

Я в тупике.

private static void CalculateWindowSize(BaseWindow window, List<View> views, bool adjustCurrentSize)
        {
            // Calculate the extra space the window consumes.
            View topView = views.First();
            double heightDiff = window.ActualHeight - topView.ActualHeight;

            double widthDiff = window.ActualWidth - topView.ActualWidth;
            double ww = window.Width; //
            double tvw = topView.Width;


            const double zeroTolerance = 0.6;
            double maxHeightMax = 0, maxWidthMax = 0;
            double maxHeightSum = 0, maxWidthSum = 0;
            double minHeightMax = 0, minWidthMax = 0;
            double minHeightSum = 0, minWidthSum = 0;
            double heightSum = 0, widthSum = 0;
            double heightMax = 0, widthMax = 0;
            foreach (View view in views)
            {
                ViewSizeBehaviour viewHeightBehaviour = GetHeightSizeBehaviour(view);
                ViewSizeBehaviour viewWidthBehaviour = GetWidthSizeBehaviour(view);

                switch (viewHeightBehaviour)
                {
                    case ViewSizeBehaviour.Sum:
                    {
                        if (!double.IsInfinity(view.MaxHeight)) maxHeightSum += view.MaxHeight;
                        if (Math.Abs(view.MinHeight) > zeroTolerance) minHeightSum += view.MinHeight;

                        // Default to MinHeight if WindowHeight not defined
                        if (!double.IsNaN(view.WindowHeight)) heightSum += view.WindowHeight;
                        else heightSum += view.MinHeight;
                        break;
                    }
                    case ViewSizeBehaviour.Max:
                    {
                        if (!double.IsInfinity(view.MaxHeight)) maxHeightMax = Math.Max(maxHeightMax, view.MaxHeight);
                        if (Math.Abs(view.MinHeight) > zeroTolerance) minHeightMax = Math.Max(minHeightMax, view.MinHeight);

                        // Default to MinHeight if WindowHeight not defined
                        heightMax = Math.Max(heightMax, !double.IsNaN(view.WindowHeight) ? view.WindowHeight : view.MinHeight);
                        break;
                    }
                }

                switch (viewWidthBehaviour)
                {
                    case ViewSizeBehaviour.Sum:
                    {
                        if (!double.IsInfinity(view.MaxWidth)) maxWidthSum += view.MaxWidth;
                        if (Math.Abs(view.MinWidth) > zeroTolerance) minWidthSum += view.MinWidth;

                        // Default to MinWidth if WindowWidth not defined
                        if (!double.IsNaN(view.WindowWidth)) widthSum += view.WindowWidth;
                        else widthSum += view.MinWidth;
                        break;
                    }
                    case ViewSizeBehaviour.Max:
                    {
                        if (!double.IsInfinity(view.MaxWidth)) maxWidthMax = Math.Max(maxWidthMax, view.MaxHeight);
                        if (Math.Abs(view.MinWidth) > zeroTolerance) minWidthMax = Math.Max(minWidthMax, view.MinWidth);

                        // Default to MinWidth if WindowWidth not defined
                        widthMax = Math.Max(widthMax, !double.IsNaN(view.WindowWidth) ? view.WindowWidth : view.MinWidth);
                        break;
                    }
                }
            }

            if (adjustCurrentSize)
            {
                window.Height = Math.Max(heightSum, heightMax) + heightDiff;
                window.Width = Math.Max(widthSum, widthMax) + widthDiff;
            }

            // Only set maximum height & width if they are greater than zero. Otherwise all views have specified Infinity as max height

            double maxHeight = Math.Max(maxHeightSum, maxHeightMax);
            double maxWidth = Math.Max(maxWidthSum, maxWidthMax);
            if (Math.Abs(maxHeight) > zeroTolerance)
            {
                window.MaxHeight = maxHeight + heightDiff;
                if (window.MaxHeight < window.Height || window.MaxHeight < window.ActualHeight)
                {
                    window.Height = window.MaxHeight;
                }
            }
            if (Math.Abs(maxWidth) > zeroTolerance)
            {
                window.MaxWidth = maxWidth + widthDiff;
                if (window.MaxWidth < window.Width || window.MaxWidth < window.ActualWidth)
                {
                    window.Width = window.MaxWidth;
                }
            }

            // Minimum height & width are the maximum of either the sum or max calculations

            window.MinHeight = Math.Max(minHeightSum, minHeightMax) + heightDiff;
            window.MinWidth = Math.Max(minWidthSum, minWidthMax) + widthDiff;

1 Ответ

0 голосов
/ 26 марта 2019

В тегах вопроса указано WPF и XAML, но код написан так, как будто это приложение winforms, поэтому я не уверен на 100%, как ответить на этот вопрос.
Я продолжу впредположение, что теги верны, и вы новичок в WPF.

В основном весь код в вашем вопросе не нужен в приложении WPF.Одним из основных преимуществ WPF над Winforms является автоматическое изменение размера контента;что Winforms не для вас.

В WPF вы настраиваете XAML в вашем UserControl так, чтобы при возникновении условия ошибки UserControl Validation Error становился Visibile.Вы просто связываете логическое свойство со свойством Visibility UserControl (также используйте ValueConverter), а затем, когда ошибка обрабатывается, устанавливается значение false, а валидация UserControl исчезает, и WPF автоматически изменяет размер остального содержимого.Вы не пишете код для изменения размера (это старый способ Winforms).

Конечно, в XAML есть много вещей, которые нужно изучить, чтобы настроить UserControls так, чтобы автоматическое изменение размера происходило так, как вы этого хотите.к, но громоздкий написание кода со всей математикой, вычислением и перерисовкой просто больше не требуется.

Надеюсь, что это укажет вам правильное направление.Существует множество учебных пособий и справок по настройке пользовательских элементов управления в XAML и привязке логических свойств к свойству Visibility ваших элементов управления и использованию IValueConverters.

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