Невозможно нарисовать прямоугольник на WindowsFormsHost с помощью Adorners в WPF

В моем приложении WPF я добавил WindowsFormsHost в одну сетку, я хочу нарисовать прямоугольник на элементе управления внутри WinFormsHost.

Макет приложения:

Изображение макета приложения

Код, который я пытаюсь:

Класс декоративного элемента

public class SimpleRectAdorner : Adorner
    {
        // Be sure to call the base class constructor.
        public SimpleRectAdorner(UIElement adornedElement)
          : base(adornedElement)
        {
        }

        // A common way to implement an adorner's rendering behavior is to override the OnRender
        // method, which is called by the layout system as part of a rendering pass.
        protected override void OnRender(DrawingContext drawingContext)
        {
            Rect adornedElementRect = new Rect(this.AdornedElement.DesiredSize);

            // Some arbitrary drawing implements.
            SolidColorBrush renderBrush = new SolidColorBrush(Colors.Green);
            renderBrush.Opacity = 0.2;
            Pen renderPen = new Pen(new SolidColorBrush(Colors.Navy), 1.5);

            // Draw a circle at each corner.
            Rect rect = new Rect(new Point(adornedElementRect.TopLeft.X, adornedElementRect.TopLeft.Y + 50), new Size(150, 50));
            drawingContext.DrawRectangle(renderBrush, renderPen, rect);
        }
    }

Код для добавления украшения

 private void btnDraw_Click(object sender, RoutedEventArgs e)
        {
            AdornerLayer.GetAdornerLayer(viewerGrid.Children[0]).Add(new SimpleRectAdorner(viewerGrid.Children[0]));
        }

Есть ли способ нарисовать прямоугольник в элементе управления, который находится внутри WindowsFormsHost?

Заранее спасибо.


person iKishanSojitra    schedule 26.11.2016    source источник
comment
См. здесь: stackoverflow.com/q/9920480/1136211   -  person Clemens    schedule 26.11.2016


Ответы (1)


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

Если второй слой добавляется поверх первого слоя, просто добавьте третий слой поверх второго. Другое окно или всплывающее окно может отображаться поверх вашего WindowsFormsHost, и хотя вам придется прыгать через некоторые обручи, чтобы все это выглядело как часть одного и того же окна — гарантируя, что все перемещается, сворачивается и восстанавливается одновременно, и т. д. - это, безусловно, возможно.

Вы можете использовать прозрачность на третьем уровне, чтобы содержимое WindowsFormsHost отображалось и к нему можно было получить доступ. Например, вы можете установить для AllowsTransparency значение true во всплывающем окне WPF. Это будет немного дополнительной работы, но если вам абсолютно необходима эта функция, вы можете это сделать.

person Daniel    schedule 09.03.2018