Как программно создать окно WPF в приложении WinForm

У меня есть существующее приложение WinForm, которое слишком много для переноса в WPF прямо сейчас. Тем не менее, мне нужно окно с каким-то сложным режимом прозрачности, которого я не могу добиться в WinForm (да, попробовал Layerd Windows, но это не-go).

WPF позволяет красиво и просто выполнять поведение прозрачности.

Конечно, я googled, но могу только найти подсказки, как создать элемент управления WPF в WinForm, но это НЕ то, что мне нужно. Мне нужно отдельное окно WPF, которое полностью зависит от моих других форм.

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

Как создать окно WPF в приложении WinForm?

Ответ 1

Добавьте необходимые ссылки WPF к вашему проекту, создайте WPF Window -nstance, вызовите EnableModelessKeyboardInterop и покажите окно.

Вызов EnableModelessKeyboardInterop гарантирует, что ваше окно WPF получит ввод с клавиатуры из вашего приложения Windows Forms.

Позаботьтесь, если вы откроете новое окно из своего окна WPF, вход в клавиатуру не будет перенаправлен в это новое окно. Вы должны также вызвать эти вновь созданные окна EnableModelessKeyboardInterop.

В соответствии с вашими другими требованиями используйте Window.Topmost и Window.AllowsTransparency. Не забудьте установить WindowStyle в None, в противном случае прозрачность не поддерживается.

Обновление
Следующие ссылки должны быть добавлены для использования WPF в приложении форм Windows:

  • PresentationCore
  • PresentationFramework
  • System.Xaml
  • WindowsBase
  • WindowsFormsIntegration

Ответ 2

Здесь (проверенное) решение. Этот код можно использовать как в WinForm, так и в приложении WPF. XAML вообще не нужен.

#region WPF
// include following references:
//   PresentationCore
//   PresentationFramework
//   WindowsBase

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
 #endregion


public class WPFWindow : Window
{

    private Canvas canvas = new Canvas();

    public WPFWindow()
    {
        this.AllowsTransparency = true;
        this.WindowStyle = WindowStyle.None;
        this.Background = Brushes.Black;
        this.Topmost = true;

        this.Width = 400;
        this.Height = 300;
        canvas.Width = this.Width;
        canvas.Height = this.Height;
        canvas.Background = Brushes.Black;
        this.Content = canvas;
    }
}

Фон окна полностью прозрачен. Вы можете рисовать на холсте, и каждый элемент может иметь свою прозрачность (которую вы можете определить, установив альфа-канал кисти, используемой для рисования). Просто вызовите окно с чем-то вроде

WPFWindow w = new WPFWindow();
w.Show();