Procedura dettagliata: hosting di controlli compositi 3D di WPF in Windows Form
In questa procedura dettagliata viene illustrato come creare un controllo composito WPF e inserirlo in controlli e form Windows Forms utilizzando il controllo ElementHost.
In questa procedura dettagliata viene implementato un oggetto UserControl WPF che contiene due controlli figlio. Nell'oggetto UserControl viene visualizzato un cono tridimensionale (3D). L'esecuzione del rendering di oggetti tridimensionali è più facile con WPF rispetto a Windows Forms. È pertanto opportuno ospitare una classe WPFUserControl per creare grafica 3D in Windows Forms.
Di seguito vengono elencate le attività illustrate nella procedura dettagliata:
Creazione dell'oggetto UserControl WPF.
Creazione del progetto host Windows Form.
Hosting dell'oggetto UserControl WPF.
Per un elenco di codice completo delle attività illustrate in questa procedura dettagliata, vedere Esempio di hosting di un controllo composito di WPF 3D in Windows Form.
Prerequisiti
Per completare la procedura dettagliata, è necessario disporre dei componenti seguenti:
- Visual Studio 2008.
Creazione di UserControl
Per creare UserControl
Creare un progetto di libreria di controlli utente WPF denominato HostingWpfUserControlInWf.
Aprire UserControl1.xaml in WPF Designer.
Sostituire il codice generato con il seguente.
Con questo codice viene definito un oggetto System.Windows.Controls.UserControl che contiene due controlli figlio. Il primo controllo figlio è un controllo System.Windows.Controls.Label, il secondo è un controllo Viewport3D che consente di visualizzare un cono tridimensionale.
<UserControl x:Class="HostingWpfUserControlInWf.UserControl1" xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" > <Grid> <!-- Place a Label control at the top of the view. --> <Label HorizontalAlignment="Center" TextBlock.TextAlignment="Center" FontSize="20" Foreground="Red" Content="Model: Cone"/> <!-- Viewport3D is the rendering surface. --> <Viewport3D Name="myViewport" > <!-- Add a camera. --> <Viewport3D.Camera> <PerspectiveCamera FarPlaneDistance="20" LookDirection="0,0,1" UpDirection="0,1,0" NearPlaneDistance="1" Position="0,0,-3" FieldOfView="45" /> </Viewport3D.Camera> <!-- Add models. --> <Viewport3D.Children> <ModelVisual3D> <ModelVisual3D.Content> <Model3DGroup > <Model3DGroup.Children> <!-- Lights, MeshGeometry3D and DiffuseMaterial objects are added to the ModelVisual3D. --> <DirectionalLight Color="#FFFFFFFF" Direction="3,-4,5" /> <!-- Define a red cone. --> <GeometryModel3D> <GeometryModel3D.Geometry> <MeshGeometry3D Positions="0.293893 -0.5 0.404509 0.475528 -0.5 0.154509 0 0.5 0 0.475528 -0.5 0.154509 0 0.5 0 0 0.5 0 0.475528 -0.5 0.154509 0.475528 -0.5 -0.154509 0 0.5 0 0.475528 -0.5 -0.154509 0 0.5 0 0 0.5 0 0.475528 -0.5 -0.154509 0.293893 -0.5 -0.404509 0 0.5 0 0.293893 -0.5 -0.404509 0 0.5 0 0 0.5 0 0.293893 -0.5 -0.404509 0 -0.5 -0.5 0 0.5 0 0 -0.5 -0.5 0 0.5 0 0 0.5 0 0 -0.5 -0.5 -0.293893 -0.5 -0.404509 0 0.5 0 -0.293893 -0.5 -0.404509 0 0.5 0 0 0.5 0 -0.293893 -0.5 -0.404509 -0.475528 -0.5 -0.154509 0 0.5 0 -0.475528 -0.5 -0.154509 0 0.5 0 0 0.5 0 -0.475528 -0.5 -0.154509 -0.475528 -0.5 0.154509 0 0.5 0 -0.475528 -0.5 0.154509 0 0.5 0 0 0.5 0 -0.475528 -0.5 0.154509 -0.293892 -0.5 0.404509 0 0.5 0 -0.293892 -0.5 0.404509 0 0.5 0 0 0.5 0 -0.293892 -0.5 0.404509 0 -0.5 0.5 0 0.5 0 0 -0.5 0.5 0 0.5 0 0 0.5 0 0 -0.5 0.5 0.293893 -0.5 0.404509 0 0.5 0 0.293893 -0.5 0.404509 0 0.5 0 0 0.5 0 " Normals="0.7236065,0.4472139,0.5257313 0.2763934,0.4472138,0.8506507 0.5308242,0.4294462,0.7306172 0.2763934,0.4472138,0.8506507 0,0.4294458,0.9030925 0.5308242,0.4294462,0.7306172 0.2763934,0.4472138,0.8506507 -0.2763934,0.4472138,0.8506507 0,0.4294458,0.9030925 -0.2763934,0.4472138,0.8506507 -0.5308242,0.4294462,0.7306172 0,0.4294458,0.9030925 -0.2763934,0.4472138,0.8506507 -0.7236065,0.4472139,0.5257313 -0.5308242,0.4294462,0.7306172 -0.7236065,0.4472139,0.5257313 -0.858892,0.429446,0.279071 -0.5308242,0.4294462,0.7306172 -0.7236065,0.4472139,0.5257313 -0.8944269,0.4472139,0 -0.858892,0.429446,0.279071 -0.8944269,0.4472139,0 -0.858892,0.429446,-0.279071 -0.858892,0.429446,0.279071 -0.8944269,0.4472139,0 -0.7236065,0.4472139,-0.5257313 -0.858892,0.429446,-0.279071 -0.7236065,0.4472139,-0.5257313 -0.5308242,0.4294462,-0.7306172 -0.858892,0.429446,-0.279071 -0.7236065,0.4472139,-0.5257313 -0.2763934,0.4472138,-0.8506507 -0.5308242,0.4294462,-0.7306172 -0.2763934,0.4472138,-0.8506507 0,0.4294458,-0.9030925 -0.5308242,0.4294462,-0.7306172 -0.2763934,0.4472138,-0.8506507 0.2763934,0.4472138,-0.8506507 0,0.4294458,-0.9030925 0.2763934,0.4472138,-0.8506507 0.5308249,0.4294459,-0.7306169 0,0.4294458,-0.9030925 0.2763934,0.4472138,-0.8506507 0.7236068,0.4472141,-0.5257306 0.5308249,0.4294459,-0.7306169 0.7236068,0.4472141,-0.5257306 0.8588922,0.4294461,-0.27907 0.5308249,0.4294459,-0.7306169 0.7236068,0.4472141,-0.5257306 0.8944269,0.4472139,0 0.8588922,0.4294461,-0.27907 0.8944269,0.4472139,0 0.858892,0.429446,0.279071 0.8588922,0.4294461,-0.27907 0.8944269,0.4472139,0 0.7236065,0.4472139,0.5257313 0.858892,0.429446,0.279071 0.7236065,0.4472139,0.5257313 0.5308242,0.4294462,0.7306172 0.858892,0.429446,0.279071 " TriangleIndices="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 " /> </GeometryModel3D.Geometry> <GeometryModel3D.Material> <DiffuseMaterial> <DiffuseMaterial.Brush> <SolidColorBrush Color="Red" Opacity="1.0"/> </DiffuseMaterial.Brush> </DiffuseMaterial> </GeometryModel3D.Material> </GeometryModel3D> </Model3DGroup.Children> </Model3DGroup> </ModelVisual3D.Content> </ModelVisual3D> </Viewport3D.Children> </Viewport3D> </Grid> </UserControl>
Creazione del progetto host Windows Form
Per creare il progetto host
Aggiungere un progetto di applicazione Windows denominato WpfUserControlHost alla soluzione. Per ulteriori informazioni, vedere Procedura: creare un nuovo progetto di applicazione WPF.
In Esplora soluzioni aggiungere un riferimento all'assembly WindowsFormsIntegration, denominato WindowsFormsIntegration.dll.
Aggiungere riferimenti agli assembly WPF riportati di seguito:
PresentationCore
PresentationFramework
WindowsBase
Aggiungere un riferimento al progetto HostingWpfUserControlInWf.
In Esplora soluzioni, impostare il progetto WpfUserControlHost come progetto di avvio.
Hosting di UserControl di Windows Presentation Foundation
Per ospitare UserControl
In Progettazione Windows Form aprire Form1.
Fare clic sul pulsante Eventi nella finestra Proprietà, quindi fare doppio clic sull'evento Load per creare un gestore eventi.
L'editor di codice si apre in corrispondenza del gestore eventi Form1_Load appena generato.
Sostituire il codice in Form1.cs con il codice riportato di seguito.
Il gestore eventi Form1_Load crea un'istanza di UserControl1 e la aggiunge all'insieme di controlli figlio del controllo ElementHost. Il controllo ElementHost viene aggiunto all'insieme di controlli figlio del form.
Imports System Imports System.Collections.Generic Imports System.ComponentModel Imports System.Data Imports System.Drawing Imports System.Text Imports System.Windows.Forms Imports System.Windows.Forms.Integration Public Class Form1 Inherits Form Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Create the ElementHost control for hosting the ' WPF UserControl. Dim host As New ElementHost() host.Dock = DockStyle.Fill ' Create the WPF UserControl. Dim uc As New HostingWpfUserControlInWf.UserControl1() ' Assign the WPF UserControl to the ElementHost control's ' Child property. host.Child = uc ' Add the ElementHost control to the form's ' collection of child controls. Me.Controls.Add(host) End Sub End Class
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Windows.Forms.Integration; namespace WpfUserControlHost { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // Create the ElementHost control for hosting the // WPF UserControl. ElementHost host = new ElementHost(); host.Dock = DockStyle.Fill; // Create the WPF UserControl. HostingWpfUserControlInWf.UserControl1 uc = new HostingWpfUserControlInWf.UserControl1(); // Assign the WPF UserControl to the ElementHost control's // Child property. host.Child = uc; // Add the ElementHost control to the form's // collection of child controls. this.Controls.Add(host); } } }
Premere F5 per compilare ed eseguire l'applicazione.
Vedere anche
Riferimenti
Concetti
Procedura dettagliata: hosting di controlli compositi di WPF in Windows Form
Procedura dettagliata: hosting di controlli Windows Form compositi in WPF
Altre risorse
Esempio di hosting di un controllo composito in Windows Form