34 Stimmen

Vererben von einem UserControl in WPF

Ich bin ziemlich neu in WPF und ich habe ein Problem mit Vererbung von einem Benutzersteuerelement.

Ich habe ein Benutzersteuerelement erstellt und muss nun von diesem Steuerelement erben und einige weitere Funktionen hinzufügen.

Hat jemand so etwas schon einmal gemacht? Jede Hilfe würde sehr geschätzt werden.

Dankeschön

31voto

sirrocco Punkte 7891

Nun Sie erstellen Ihre Basiskontrolle

public abstract class BaseUserControl : UserControl{...}

dann in der XAML-Datei :

<Controls:BaseUserControl x:Class="Termo.Win.Controls.ChildControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Controls="clr-namespace:Namespace.Of.Your.BaseControl">

Und das sollte funktionieren.

EDITAR: Hmm.. dieses Beispiel ist nützlich, wenn Sie eine Basis-Steuerelement ohne XAML haben und dann erben von ihm. Der andere Weg herum (von einem Basis-Steuerelement mit Xaml) - ich bin nicht sicher, wie Sie darüber gehen können.

EDIT2: Offensichtlich von dieser Beitrag + Kommentare Ich nehme an, dass das, was Sie wollen, vielleicht nicht möglich ist.

18voto

BFreeman Punkte 740

AFAIK können Sie nicht erben die xaml, können Sie nur den Code dahinter erben.

Vor kurzem sind wir bei unserem Projekt auf das gleiche Problem gestoßen. Die Art und Weise, wie wir das Problem gelöst haben, war, ein Benutzerkontrollfeld zu erstellen und es dem "untergeordneten" Benutzerkontrollfeld hinzuzufügen.

Wenn das nicht funktioniert/hilft, sehen Sie sich das an: http://geekswithblogs.net/lbugnion/archive/2007/03/02/107747.aspx 1

4voto

Tomáš Kafka Punkte 3930

Ich habe vielleicht eine kleine Lösung: Komposition statt Vererbung - ich habe mir ein Steuerelement ausgedacht, das "Inhaltsslots" hat, die von außen durch Datenbindung zugewiesen werden können, siehe meine SO Gewinde .

Beispiel für die Verwendung:

<UserControl ... >

    <!-- My wrapping XAML -->
        <Common:DialogControl>
                <Common:DialogControl.Heading>
                        <!-- Slot for a string -->
                </Common:DialogControl.Heading>
                <Common:DialogControl.Control>
                        <!-- Concrete dialog's content goes here -->
                </Common:DialogControl.Control>
                <Common:DialogControl.Buttons>
                        <!-- Concrete dialog's buttons go here -->
                </Common:DialogControl.Buttons>
        </Common:DialogControl>
    <!-- /My wrapping XAML -->

</UserControl>

Zusammen mit etwas Code im Codebehind wäre es eine schöne Basiskomponente für den Windows-Dialog.

3voto

user1005465 Punkte 31

Sie können den Xaml-Code nicht selbst vererben. Das Erstellen einer abstrakten Klasse des Code Behind ermöglicht es Ihnen jedoch, den Code Behind von einem abgeleiteten Klassenobjekt aus zu bearbeiten.

Xaml-Code: { Window1.xaml }

<Window 
x:Class="WPFSamples.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="auto" Width="256" Title="WPF Sameples">
  <Grid>
    <Button x:Name="Button1" VerticalAlignment="Center" HorizontalAlignment="Center" Content="Click Me"/>
  </Grid>
</Window>

CodeBehind: { Window1.xaml.cs }

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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 WPFSamples
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public abstract partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
    }
}

Abgeleitete Klasse : { DisabledButtonWindow.cs }

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WPFSamples
{
    public sealed class DisabledButtonWindow : Window1
    {
        public DisabledButtonWindow()
        {
            Button1.IsEnabled = false;
        }
    }
}

Obwohl Sie nicht von der WPF-Quelle selbst erben können, können Sie dieses "Window1"-Steuerelement als Vorlage für alle anderen abgeleiteten Steuerelemente verwenden.

1voto

Maximiliano Punkte 19

Sie können dies erreichen, indem Sie eine delegate .

Im Wesentlichen müssen Sie eine Schnittstelle erstellen ( YourInterface ), die die gewünschte Funktionalität umschließt, und implementieren Sie diese Schnittstelle sowohl in der Benutzersteuerung als auch in Ihrer Klasse.

Stellen Sie als nächstes sicher, dass die Benutzerkontrolle einen Verweis auf ein Objekt des Typs IYourInterface so dass, wenn Ihre Benutzerkontrolle versucht, eine Methode der Interface ruft es die Methode Ihrer Klasse auf.

Da sowohl die Benutzerkontrolle als auch die Klasse dieselbe Schnittstelle implementieren, können sie als dieselbe Art von Objekt betrachtet werden - das heißt, man kann beide in eine Sammlung von Objekten des Typs IYourInterface . Damit sollten Sie das gewünschte Verhalten erzielen.

In ASP.NET verwende ich diese Technik häufig, indem ich meine Klassen von abstract class Vorfahren. Ich verstehe nicht, warum WPF dies nicht unterstützt :(

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X