2010-10-20 22 views
5

Ich habe ein Problem mit Steuerelementvererbung in WPF. Ich habe ein UserControl namens BaseUserControl erstellt. Ich möchte, dass dieses Steuerelement ein Basissteuerelement für andere WPF-Benutzersteuerelemente ist. Also schrieb ich ein anderes UserControl namens FirstComponent. Im nächsten Schritt änderte ich diesen Codewpf - UserControl Vererbung

FirstComponent : UserControl 

dieser

FirstComponent : BaseControl 

jedoch während der Kompilierung ich diesen Fehler

Partial declarations of 'controlinheritance.componenets.FirstComponent' must not specify different base classes 

Was soll ich tun FirstComponent zu ermöglichen, von basecontrol abzuleiten?

EDIT Dank abhishek Antwort ich es geschafft, Steuerelemente zu erben. Trotzdem habe ich eine andere Frage. In der Basisklasse habe ich eine Eigenschaft public Grid _MainGrid {get; einstellen; }. Jetzt möchte ich in meiner abgeleiteten Klasse eine Instanz dieses Rasters erstellen. Also habe ich diesen Code verwendet Howerver bekomme ich einen Fehler Eigenschaft '_MainGrid' hat keinen Wert. Linie 8 Position 36.

Antwort

5

Haben Sie meinen vollständigen Artikel darüber gesehen?

http://www.dotnetfunda.com/articles/article832-define-base-class-for-window--usercontrol-.aspx

Ich hoffe, dass Sie in diesem helfen würde.

Wenn Sie versuchen, das Projekt auszuführen, würde es definitiv Fehler zu Sie werfen. Dies liegt daran, dass jedes WPF-Fenster vom baseWindow -Layout und nicht vom aktuellen Window-Layout erstellt wird. Mit anderen Worten, wenn Sie das XAML sehen, sehen Sie das root-Tag Window, das eine Klasse nur Eltern des aktuellen Fensters ist.

Damit alles funktioniert, müssen wir das Root Element ändern.

So würde es wie folgt aussehen:

<local:BaseWindow Class="BaseWindowSample.Window1" 
        Name="winImp" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:local="clr-namespace:BaseWindowSample" 
        Title="Window1"> 
... 
</local:BaseWindow> 

Wenn Sie diese genauestens zu sehen, können Sie sehen, ich habe einen Namespace zu meinem Projekt hinzugefügt und es als lokale benannt. So sollte BaseWindow kommen aus BaseWindow und so geht es wie lokale: BaseWindow

+0

Dank ändern half es mir sehr viel . Könntest du meine editierte Nachricht sehen? – Berial

0

Nun, der Grund für den anfänglichen Fehler war, weil die Klasse war eigentlich eine partielle Klasse, wurde die Auflistung des eine bestimmte Basis Erbschaft woanders zusätzlich zu Speicherort, an dem Sie Ihre Basisklasse geändert haben.

Wie für Ihre Eigenschaft ‚Vererbung‘, schlage ich versuche

public Grid MainGrid 
{ 
    get 
    { 
     return base.MainGrid; 
    } 

    set 
    { 
     base.MainGrid = value; 
    } 
} 

aber ich, dass diese Ihnen Ihre Basisklasse einen Link zu einer vorhandenen Instanz (en) gibt nicht beachten soll. Wenn Sie möchten, dass in Ihrer abgeleiteten Klasse eine garantierte Verknüpfung zu der einzelnen Instanz dieses Rasters vorhanden ist, müssen Sie die Basisklasseneigenschaft statisch machen. In diesem Fall wird Ihr Code so aussehen ...

public Grid MainGrid 
{ 
    get 
    { 
     return BaseControl.MainGrid; 
    } 

    set 
    { 
     BaseControl.MainGrid = value; 
    } 
} 
0

Wenn Sie eine andere Basisklasse für eine Usercontrol angeben, in den XAML.cs Datei

FirstComponent : BaseControl 

Sie sollten dies auch in der XAML

<Base:BaseControl x:Class="FirstComponent" 
      xmlns:Base="clr-namespace:MyApplication.Base" 
      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" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 


    </Grid> 
</Base:BaseControl>