как сохранить WPF UserControl загруженным и использовать HwndSource (проблема с исключением: root Visual of Visual Target не может иметь родителя) - PullRequest
0 голосов
/ 18 марта 2020

Я создал UserControl и отображаю его во внешнем окне. Это означает, что я создал плагин, и он используется в хост-приложении (не созданном мной), который отображает этот WPF UserControl как GUI.

Все работает, я могу открыть окно и оно ok , за исключением

Проблема

, когда окно воссоздается приложением хоста. Это означает, что при двойном щелчке по окну хост-приложение меняет окно (быстро воссоздано ) и добавляет собственную (хост-приложение) панель внутри окна. Затем Я получаю это исключение:

System.ArgumentException: root Visual of Visual Target не может иметь родителя

...

в mf_GetViewIP (IntPtr & view) в App.Xaml.csline 78

Вот код, как я отображаю WPF USerControl

private void mf_GetViewIP(ref IntPtr view)
        {
            try
            {
                if (m_main_view == null) 
                {         
                    m_main_view = new Views.uc_main_view();
                    m_main_view.VerticalAlignment = VerticalAlignment.Stretch;
                    m_main_view.HorizontalAlignment = HorizontalAlignment.Stretch;
                }

                sourceParam = new HwndSourceParameters("Arpegissimo ML");
                sourceParam.PositionX = 0;
                sourceParam.PositionY = 0;
                sourceParam.ParentWindow = view;
                sourceParam.WindowStyle = WS_VISIBLE | WS_CHILD;

                source = new HwndSource(sourceParam);
                source.RootVisual = m_main_view; // csline 78 (exception)

            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
            if (mfp_wai_set != null)
            {
                mfp_wai_set();
            }
        }

Исключение исчезает, когда if (m_main_view == null) удалено и m_main_view всегда new, и это то, чего я хочу избежать.


Вопрос

Как сохранить m_main_view (не использовать каждый раз new) без получения этого исключения? Является ли это возможным? Я просто хочу избегать загрузки каждый раз и готовить свой вид, когда GUI отображается во второй раз.

1 Ответ

0 голосов
/ 18 марта 2020

Я нашел решение

    private void mf_GetViewIP(ref IntPtr view)
    {
        try
        {
            if (m_main_view == null) 
            {         
                m_main_view = new Views.uc_main_view();
                m_main_view.VerticalAlignment = VerticalAlignment.Stretch;
                m_main_view.HorizontalAlignment = HorizontalAlignment.Stretch;
            }

            if (source != null)
            {
                source.Dispose(); // need to clear hold old reference to m_main_view
            }

            sourceParam = new HwndSourceParameters("Arpegissimo ML");
            sourceParam.PositionX = 0;
            sourceParam.PositionY = 0;
            sourceParam.ParentWindow = view;
            sourceParam.WindowStyle = WS_VISIBLE | WS_CHILD;

            source = new HwndSource(sourceParam);
            source.RootVisual = m_main_view;

        }
        catch (Exception e)
        {
            MessageBox.Show(e.ToString());
        }
        if (mfp_wai_set != null)
        {
            mfp_wai_set();
        }
    }

Я думаю, что когда хост-приложение воссоздает окно, оно происходит так быстро, что не так быстро (со стороны WPF) удалить его из HwndSource (потому что когда windows открывается вручную (без исключения), поэтому необходимо вызвать HwndSource.Dispose().

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