herbrich19
Goto Top

WPF Form in Windows Forms Multi Document Interface

Hallo,

Ich würde gerne eine WPF Form in eine Windows Forms Anwendung einbauen. Diese soll in einen Multi Document Interface fernster angezeigt werden. Ist sowas möglich?

Gruß an die IT-Welt,
J Herbrich

Content-Key: 343064

Url: https://administrator.de/contentid/343064

Printed on: July 21, 2024 at 13:07 o'clock

Member: MrCount
MrCount Jul 11, 2017 updated at 14:50:48 (UTC)
Goto Top
Servus,

hast du dir diese Seiten schon mal angesehen?

[edit]
bzw. hier
Member: Herbrich19
Herbrich19 Jul 11, 2017 at 17:33:13 (UTC)
Goto Top
Hallo,

Danke für die Links. Wichtig ist halt das die WPF Forms in MDI Kontainer geöffnet werden und nicht als freistehendes Fenster.

Gruß an die IT-Welt,
J Herbrich
Member: colinardo
colinardo Jul 14, 2017 updated at 17:41:02 (UTC)
Goto Top
Servus @Herbrich19,
Kannst du machen, z.B. so
using System;
using System.Windows.Forms;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Interop;
using System.Runtime.InteropServices;

namespace WinformsMDIwithWPFChild {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
        }

        [DllImport("user32.dll")]  
        public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

        private void Form1_Load(object sender, EventArgs e) {
            //Add WPF Window
            WPFWindow w = new WPFWindow();
            System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(w);
            WindowInteropHelper helper = new WindowInteropHelper(w);
            helper.Owner = this.Handle;
            w.Show();
            SetParent(helper.Handle, this.Handle);
        }
    }
    // class creates WPF Window
    public class WPFWindow : Window {
        private Canvas canvas = new Canvas();
        private TextBlock block = new TextBlock();
        public WPFWindow() {
            this.WindowStyle = WindowStyle.ToolWindow;
            this.Background = System.Windows.Media.Brushes.White;

            this.Width = 250;
            this.Height = 250;
            canvas.Width = this.Width;
            canvas.Height = this.Height;
            canvas.Background = System.Windows.Media.Brushes.White;
            block.Text = "WPF";  
            block.FontSize = 20;
            canvas.Children.Add(block);
            this.Content = canvas;
        }
    }
}
Folgende Verweise müssen dem WinForms-Projekt hinzugefügt werden damit dort WPF nutzbar wird:
  • PresentationCore
  • PresentationFramework
  • System.Xaml
  • WindowsBase
  • WindowsFormsIntegration
----
screenshot

Grüße Uwe
Member: Herbrich19
Herbrich19 Jul 14, 2017 at 18:28:18 (UTC)
Goto Top
Hallo,

Vielen herzlichen Dank, kann ich mit Partial Class Form 'WPF Form Klasse in der Master Datei (herbrich.dll) jede WPF Form in diesen Projekt in den MDI Kontainer einbinden oder muss ich für jedes WPF Formular den Code neu einbauen?

Gruß an die IT-Welt,
J Herbrich
Member: colinardo
colinardo Jul 15, 2017 updated at 06:31:49 (UTC)
Goto Top
Ja, klar das war ja nur ein simples Beispiel, selbstverständlich kannst du stattdessen deine Form mit bestehendem XAML Code bauen, du kannst auch beliebige EXEs in die Anwendung einsperren, wenn sie als Parent deine App gesetzt bekommen, sind dann zwar keine richtigen MDI-Windows aber fühlen sich dann zumindest so an.
Ich würde dir aber trotzdem dazu raten in Zukunft komplett auf WPF umzustellen.
Member: colinardo
colinardo Jul 23, 2017 at 10:33:51 (UTC)
Goto Top
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen, und Lösungen markieren. Merci.
Member: Herbrich19
Herbrich19 Jul 30, 2017 at 19:23:12 (UTC)
Goto Top
Hallo,

Wird hier wirklich eine Leere Windows Form geöffnet um dan in deren load die WPF zu öffnen oder lese ich den Code falsch?

Gruß an die IT-Welt,
J Herbrich
Member: colinardo
colinardo Jul 31, 2017 updated at 09:09:26 (UTC)
Goto Top
Zitat von @Herbrich19:

Wird hier wirklich eine Leere Windows Form geöffnet
Klar, bis auf das die Eigenschaft MDI-Container der Form gesetzt wurde hat sie keinen Inhalt.
um dan in deren load die WPF zu öffnen oder lese ich den Code falsch?
Ja.
Member: Herbrich19
Herbrich19 Aug 01, 2017 at 11:06:54 (UTC)
Goto Top
Hallo,

Hmm, die Lösung ist zwar gut aber ich würde doch gerne auf eine Lere Windows Form verzichten. Kann ich diese ansonsten auch weglassen (also den Show befehl für die Windows Form?

Mein erster versuch mit WPF Controls war ja im der dass ich keine Animation in form von KeyFrames laufen lassen kann in ein Control was mich zu den Forms bringt.

Gruß an die IT-Welt,
J Herbrich
Member: colinardo
colinardo Aug 01, 2017 updated at 12:59:42 (UTC)
Goto Top
Zitat von @Herbrich19:

Hallo,

Hmm, die Lösung ist zwar gut aber ich würde doch gerne auf eine Lere Windows Form verzichten. Kann ich diese ansonsten auch weglassen (also den Show befehl für die Windows Form?
? Wie willst du ein WPF Window in einen MDI Container packen wenn du keine Form hast die den MDI-Container hostet ?? Irgendwie verstehst du da was falsch. Im Code oben ist eine Windows Form der Parent als MDI Container. Dann wird eine WPF Form im Code erzeugt, angezeigt und dessen Parent auf die Windows Form gelegt, nicht mehr und nich weniger. Das Linke Fenster das du im MDI Container siehst ist nicht im Code enthalten das war nur zur Veranschaulichung im Bild.
Mein erster versuch mit WPF Controls war ja im der dass ich keine Animation in form von KeyFrames laufen lassen kann in ein Control was mich zu den Forms bringt.
?? Geht völlig am Thema vorbei, sorry. Und WPF bietet sehr wohl deutlich mehr Funktionalität in diese Richtung, nur ist bei WPF im Allgemeinen mehr Abstrahierung in Datenmodelle und Klassen das Maß der Dinge, dadurch aber auch portabel in diverse Formate und Platformen.

Also lass den Mischmasch und fackel es gleich mit WPF ab, damit bleibst du flexibel in alle Richtungen, auch wenn es vielleicht am Anfang Umdenken erfordert.
Member: Herbrich19
Herbrich19 Aug 02, 2017 at 22:49:43 (UTC)
Goto Top
Hallo,

Danke das beantwortet alle meine Fragen. Und klar brauche ich den MDI Kontainer und ja der existiert bereits seit dem diese Software in ihrer ersten version Programmiert wurde.

Jetzt geht es nur darum dass ich die weitere Entwicklung dieser Software in WPF durchführen möchte aber ohne das bestehnde System komplett zu ersetzen.

Gruß an die IT-Welt,
J Herbrich