C # WPF Изменение размера вопроса - PullRequest
2 голосов
/ 17 ноября 2010

Я работаю над приложением для панели мониторинга, где я хотел бы позволить пользователю изменять размеры виджетов на холсте. Оглядываясь вокруг, мне показалось, что лучшим решением было использование класса Microsoft ResizingAdorner. Пример можно найти здесь , а код можно найти здесь (примерно на четверть пути вниз по странице). Казалось, все работало, пока я не щелкнул один из виджетов (элементы управления диаграммой из ComponentOne ). Нижний правый adorner и верхний правый adorner , казалось, появлялись примерно на ширине и высоте со стороны холста при перемещении. Смотрите пример ниже:

alt text alt text

Я был на вопросе StackOverflow здесь об использовании разделителя сетки, но это не будет работать для меня, так как элементы управления будут перекрывать столбцы сетки.

У меня тоже был похожий вопрос , но первый ответ вообще не работает, а второй ответ просто указывает на блог , где джентльмен либо работает в Microsoft, и создает класс ResizingAdorner, либо просто копирует код с сайта примеров wpf. Я также попробовал пересмотренный код здесь , но без удачи. Есть ли быстрое исправление, которого я не вижу

1 Ответ

1 голос
/ 18 ноября 2010

Глядя на код немного глубже, я обнаружил часть, которая вычитала x и y из желаемой ширины и высоты, даже подумав, что я еще не перетаскивал рекламодателя.поэтому я изменил следующий код в их примере:

protected override Size ArrangeOverride(Size finalSize)
        {
            // desiredWidth and desiredHeight are the width and height of the element that's being adorned.  
            // These will be used to place the ResizingAdorner at the corners of the adorned element.  
            double desiredWidth = AdornedElement.DesiredSize.Width;
            double desiredHeight = AdornedElement.DesiredSize.Height;
            // adornerWidth & adornerHeight are used for placement as well.
            double adornerWidth = this.DesiredSize.Width;
            double adornerHeight = this.DesiredSize.Height;

            topLeft.Arrange(new Rect(-adornerWidth / 2, -adornerHeight / 2, adornerWidth, adornerHeight));
            topRight.Arrange(new Rect(desiredWidth - adornerWidth / 2, -adornerHeight / 2, adornerWidth, adornerHeight));
            bottomLeft.Arrange(new Rect(-adornerWidth / 2, desiredHeight - adornerHeight / 2, adornerWidth, adornerHeight));
            bottomRight.Arrange(new Rect(desiredWidth - adornerWidth / 2, desiredHeight - adornerHeight / 2, adornerWidth, adornerHeight));

            // Return the final size.
            return finalSize;
        }

на следующий код:

protected override Size ArrangeOverride(Size finalSize)
        {
            // desiredWidth and desiredHeight are the width and height of the element that's being adorned.  
            // These will be used to place the ResizingAdorner at the corners of the adorned element.  
            double desiredWidth = AdornedElement.DesiredSize.Width;
            double desiredHeight = AdornedElement.DesiredSize.Height;
            // adornerWidth & adornerHeight are used for placement as well.
            double adornerWidth = this.DesiredSize.Width;
            double adornerHeight = this.DesiredSize.Height;

            //Orginal Microsoft code
            //topLeft.Arrange(new Rect(-adornerWidth / 2, -adornerHeight / 2, adornerWidth, adornerHeight));
            //topRight.Arrange(new Rect(desiredWidth - (adornerWidth / 2), - adornerHeight / 2, adornerWidth, adornerHeight));
            //bottomLeft.Arrange(new Rect(-adornerWidth / 2, desiredHeight - adornerHeight / 2, adornerWidth, adornerHeight));
            //bottomRight.Arrange(new Rect(desiredWidth - (adornerWidth / 2), desiredHeight - adornerHeight / 2, adornerWidth, adornerHeight));


            topLeft.Arrange(new Rect(-adornerWidth / 2, -adornerHeight / 2, adornerWidth, adornerHeight));
            topRight.Arrange(new Rect(adornerWidth / 2, -adornerHeight / 2, adornerWidth, adornerHeight));
            bottomLeft.Arrange(new Rect(-adornerWidth / 2, adornerHeight / 2, adornerWidth, adornerHeight));
            bottomRight.Arrange(new Rect(adornerWidth / 2, adornerHeight / 2, adornerWidth, adornerHeight));

            // Return the final size.
            return finalSize;
        }

Я еще не испытал никаких причуд, но это кажется правильным.

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