Domanda

Un normale UserControl appare così in XAML:

<UserControl x:Class="mynamespace.foo" ...namespaces...>
<!-- content -->
</UserControl>

Mi piacerebbe essere in grado di definire il mio oggetto di primo livello, sulla falsariga di:

<MyControl x:Class="mynamespace.mycontrol" ...namespaces...>
<!-- content -->
</UserControl>

Dove MyControl deriva da un UserControl stesso.

Ovviamente il compilatore si lamenta del fatto che "MyControl" non viene trovato.C'è un modo per aggirare questo?

È stato utile?

Soluzione

Il tag root è la classe base.Ecco perché la radice del Window1 predefinito è Window.Utilizzando l'opzione di menu Aggiungi > Controllo utente...sta infatti creando una sottoclasse per UserContol.

Se hai alcuni elementi comuni e desideri una classe base di controllo, puoi utilizzare la classe base come tag root.Non puoi derivare la tua classe da alcuna classe che abbia un albero visivo definito da xaml, ma la tua classe base può derivare da UserConrtol.

Per prima cosa definisci la tua classe base:

public class MyControlBase : UserControl
{
    // ...
}

Quindi crea la tua classe figlia specifica:

(Puoi iniziare con UserControl1 creato automaticamente e modificarlo da lì)

public partial class MyControl1 : MyControlBase
{
    public MyControl1()
    {
        InitializeComponent();
    }
}

Quindi modifica il lato Xaml in questo modo:

<MyNamespace:MyControlBase
    x:Class="MyNamespace.MyControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:MyNamespace="clr-namespace:MyNamespace">

Questo è un ottimo modo per creare controlli personalizzati derivati ​​da quelli incorporati in UserControl.In genere si consiglia di utilizzare semplicemente UserConrtols di base se possibile e di creare un controllo personalizzato solo se necessario.

buona fortuna,

Altri suggerimenti

Definisci lo spazio dei nomi in XAML e quindi utilizzare il nome di controllo come il tag:

<Window ...
    xmlns:my="..." />

    <my:mycontrol ... />

</Window>

NO.XAML dichiara cos'è visivamente un MyControl, proprio come il code-behind definisce cos'è un MyControl dal punto di vista comportamentale.Definire gli elementi visivi di un MyControl in termini di MyControl non avrebbe davvero senso:è l'equivalente, nel code-behind, di derivare MyControl da MyControl, cosa che ovviamente non faresti.

Inoltre, WPF non ti consente di derivare una classe UserControl da un'altra, ad es.se BobsControl è un UserControl non puoi scrivere <local:BobsControl x:Class="MyNamespace.MyControl... /> O.Credo che ciò sia dovuto al fatto che gli UserControl hanno un aspetto visivo (contenuto) integrato nel loro XAML e il contenuto della classe derivata dovrebbe sostituire il contenuto della classe base, quindi l'ereditarietà visiva generalmente non è utile.

Tuttavia, tu Potere fallo se l'elemento di primo livello da cui stai derivando è a costume controllo.I controlli personalizzati sono invisibili (non definiti in XAML).Quindi tu Potere crea il tuo elemento di primo livello come controllo personalizzato e quindi deriva i controlli "utente" da quello.(Se segui questa strada, probabilmente vorrai derivare il tuo controllo personalizzato da ContentControl o applicare ContentPropertyAttribute, in modo che il tuo elemento di primo livello possa contenere facilmente altro XAML.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top