Projekt-Anfragen: Tel: 07022/9319004 info@CodeDocu.de Software Entwicklung in C# WPF Asp.Net Core Vba Excel Word SQL-Server EF Linq, UWP Net
#

WPF Control innerhalb einer WinForms Anwendung
 
Wie kann man ein WPF Control Element einbetten und aufrufen in einer Windows Forms Anwendung?
Hintergrund:
Ich möchte den WPF webBrowser und einige Telerik WPF Controls einbetten in eine WinForms Anwendung und auch in eine Microsoft Office VSTO Anwendung.
 
Betrifft: Windows Forms Anwendungen, WPF Applikationen, WPF Controls, WinForm Contols, ocx, dll

 
 
Die Zusammenstellung erfolgt in zwei großen Blöcken:
 
1.Schritt:
Im ersten Schritt erstellt man ein Projekt: Windows Forms Application

 
 
Hierbei wird auch gleichzeitig eine neue Solution (Gesamtprojekt) erstellt mit einem ersten Projekt: der ausführenden Windows Forms Anwendung

 
2. Schritt
Dann erstellt man ein neues Projekt innerhalb dieser Visual Studio Solution mit File->Add->New Project

 

 
Dann befindet sich innerhalb der gesamten Solution ein zusätzliches Project vom Typ WPF User Controls Library mit einem leeren, vordefinierten WPF User Control.
Das WPF User Control besteht zunächst aus einem leeren User Control ->Grid

<UserControl ..>
<Grid>

</Grid>
</UserControl>


 
3. Schritt:
Dann zieht man einige WPF Elemente in das leere WPF UserControl.
Die Elemente kann man entweder übr die Toolbox oder direkt über das XAML Fenster eingeben.


<Grid>
<Button x:Name="btnTest" Content="WPF Testbutton" Height="52" Margin=".." VerticalAlignment="Top" .
<TextBox x:Name="tbxTest" Margin=".." TextWrapping="Wrap" Text="TextBox in WPF" Height="25" VerticalAlignment="Top"/>
 
</Grid>

 

 
4. Schritt:
Im der Windows Forms Anwendung im Formular ein HostElement hinzufügen
Hierzu das Windows Forms Projekt markieren, dann das WinForm Formular markieren und anschliessend unter der Toolbox nach: Host suchen.
Anschliessend das ElementHost Control in das WinForm Formular ziehen.

 
5.Schritt:
Sobald das ElementHost Control in dem Formular ist, kann man über das kleine Erweiterungssymbol oben am Control
die ElementHost Tasks öffnen und dann mit dem DropDown-Auswahl: [Select Hosted Control] das vorgeschlagene WPF UserControl auswählen

 
6.Schritt
Danach wird das WPF UserControl in dem WinForm Formular angezeigt

 
7.Schritt
WPF UserControl Unterelemente in der Winform übergeben
Damit man nun in der Windows Forms Anwendung zugriff auf die einzelnen Unter-Controls im WPF-UserControl bekommt, kann man die Unterelemente während der Laufzeit nach aussen veröffentlichen.
Hierzu erstellt man in der Codebehind-Seite des WPF Usercontrol public Controls vom gleichen Typ und weist diesen öffentlichen Objekten beim Initialisieren des Usercontrols die inneren Elemente zu.

public partial class UcWpf : UserControl
{
public Button btn;
public TextBox tbx;
 
 
public UcWpf()
{
InitializeComponent();
btn = btnTest;
tbx = tbxTest;
}

 

 
 
8.Schritt
Wenn man nun in der WinForms Anwendung das WPF Control auslesen möchte,
dann macht man folgendes:
8a: man nimmt das Child Element des ElementHost-Controls, welches genau dem WPF-UserControl entspricht.
8b: dann liest man die public Controls des Child Elementes, und liest deren Eigenschaften aus.
Da die Public Controls ja währende der Initialisierung übergeben wurden, zeigen diese nun den gleichwertigen Inhalt an.

private void btnWinForm_Click(object sender, EventArgs e)
{
wpfUC.UcWpf uc= elementHost1.Child as wpfUC.UcWpf;
 
MessageBox.Show("WPF Button Caption=" + uc.btn.Content + " WPF Tbx.Text=" + uc.tbx.Text);
}

 

 
Und erhält wie hier zur Laufzeit gezeigt, einen echten Zugriff auf die WPF Elemente.
In diesem Fall wird einfach der Text als Eigenschaft der beiden WPF  Controls ausgegeben.

 
 
Als Video Tutorial

 
 
Kompletter C# Code und Xaml Files
 
1: WinForm Form1.cs Code in C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using wpfUC = wpfUserControls;
 
namespace winForm_with_wpfControl_03
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
 
private void btnWinForm_Click(object sender, EventArgs e)
{
wpfUC.UcWpf uc= elementHost1.Child as wpfUC.UcWpf;
MessageBox.Show("WPF Button Caption=" + uc.btn.Content + " WPF Tbx.Text=" + uc.tbx.Text);
}
}
}
 

 
 
2: WinForm Form1 aus dem Designer

namespace winForm_with_wpfControl_03
{
partial class Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
 
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
 
#region Windows Form Designer generated code
 
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.elementHost1 = new System.Windows.Forms.Integration.ElementHost();
this.ucWpf1 = new wpfUserControls.UcWpf();
this.btnWinForm = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// elementHost1
//
this.elementHost1.Location = new System.Drawing.Point(12, 12);
this.elementHost1.Name = "elementHost1";
this.elementHost1.Size = new System.Drawing.Size(279, 256);
this.elementHost1.TabIndex = 0;
this.elementHost1.Text = "elementHost1";
this.elementHost1.Child = this.ucWpf1;
//
// btnWinForm
//
this.btnWinForm.Location = new System.Drawing.Point(341, 25);
this.btnWinForm.Name = "btnWinForm";
this.btnWinForm.Size = new System.Drawing.Size(109, 54);
this.btnWinForm.TabIndex = 1;
this.btnWinForm.Text = "WinForms Button";
this.btnWinForm.UseVisualStyleBackColor = true;
this.btnWinForm.Click += new System.EventHandler(this.btnWinForm_Click);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(505, 380);
this.Controls.Add(this.btnWinForm);
this.Controls.Add(this.elementHost1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
 
}
 
#endregion
 
private System.Windows.Forms.Integration.ElementHost elementHost1;
private wpfUserControls.UcWpf ucWpf1;
private System.Windows.Forms.Button btnWinForm;
}
}
 
 

 
 
3. WPF Xaml code

<UserControl x:Class="wpfUserControls.UcWpf"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:wpfUserControls"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<Button x:Name="btnTest" Content="WPF Testbutton" Height="52" Margin="10,10,140,0" VerticalAlignment="Top" Click="btnTest_Click"/>
<TextBox x:Name="tbxTest" Margin="10,82,140,0" TextWrapping="Wrap" Text="TextBox in WPF" Height="25" VerticalAlignment="Top"/>
 
</Grid>
</UserControl>
 

 
 
4. WPF C# Code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
namespace wpfUserControls
{
/// <summary>
/// Interaction logic for UserControl1.xaml
/// </summary>
public partial class UcWpf : UserControl
{
public Button btn;
public TextBox tbx;
 
 
public UcWpf()
{
InitializeComponent();
btn = btnTest;
tbx = tbxTest;
}
 
private void btnTest_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Button Text=" + btnTest.Content + " tbx.Text=" + tbxTest.Text);
}
 
 
}
}
 

 
Mobile
»
Winforms: Lokale Datenbank, erstellen, anbinden, anzeigen, Insert Update, Delete
»
WinForms, C#: Einträge in der Registry für den Internetexplorer und webBrowser erstellen
»
WPF Control innerhalb einer WinForms Anwendung
»
Wie öffnet man in C# WinForms ein zweites Formular?
»
Wie kopiert man ein Formular in Microsoft Winforms

.

Jobs, Projekte, Angebote für Freiberufler, Selbstständig an Info@CodeDocu.de