WPF: Fehler ein benutzerdefiniertes Steuerelement in ItemTemplate eines anderen benutzerdefinierten Steuerelement mit

StackOverflow https://stackoverflow.com/questions/1585737

Frage

ich eine benutzerdefinierte Steuer Bibliothek, wo ich mehr benutzerdefinierten Steuerelemente habe, dass ich in meiner Haupt-Anwendung zu verwenden. Ich habe ein einfaches benutzerdefiniertes Steuerelement, das den Benutzer der Stiftdicke Werte aus einer Combobox kann. Nun, ich bin eine neue benutzerdefinierte Steuerung zu schaffen, basierend auf einer Listbox, und ich mag die Stiftdicke Combobox in der neuen benutzerdefinierten Kontrolle des ItemTemplate aufzunehmen.

Ich erhalte diese Fehlermeldung:

"erstellen kann nicht Instanz von‚LineThicknessComboBox‘definiert in der Montage Custom ... Ausnahme wird durch das Ziel eines Aufruf Fehler beim Objekt geworfen worden.‚10_T‘in Markup-Datei‚Custom; Komponente / Themen / CustomListBox. General.xaml‘.

Hier ist der XAML und Code hinter der LineThicknessComboBox:

namespace CustomControls
{
    public class LineThicknessComboBox : ComboBox
    {
        public LineThicknessComboBox()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(LineThicknessComboBox)
                        , new FrameworkPropertyMetadata(typeof(LineThicknessComboBox)));

        }
    }
}

und in LineThicknessCombobox.Generic.xaml:

<ResourceDictionary 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CustomControls">

<Style TargetType="{x:Type local:LineThicknessComboBox}" BasedOn="{StaticResource {x:Type ComboBox}}">
    <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                ...
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

</ResourceDictionary>

Dies ist die XAML und Code-Behind für mein neues CustomListBox:

namespace CustomControls
{
    public class CustomListBox : ListBox
    {
        public CustomListBox()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomListBox)
                        , new FrameworkPropertyMetadata(typeof(CustomListBox)));
        }
    }
}

und in CustomListBox.Generic.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CustomControls">

<Style TargetType="{x:Type local:CustomListBox}" BasedOn="{StaticResource {x:Type ListBox}}">
    <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                <Border>
                 ...
                     <local:LineThicknessComboBox />
                 ...  
                </Border>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

</ResourceDictionary>

Und hier ist mein Generix.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="CustomControls;component/Themes/LineThicknessComboBox.Generic.xaml"/>
        <ResourceDictionary Source="CustomControls;component/Themes/CustomListBox.Generic.xaml"/>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

Ich denke, ich eine Art Referenz Problem haben, kann aber nicht herausfinden, was falsch ist. Das Programm kompiliert und läuft ohne Warnungen / Fehler, aber wenn die CustomListBox in meinem Haupt-Anwendung erstellt wird, habe ich den Fehler oben aufgeführten erhalten. Ohne einschließlich der LineThicknessComboBox arbeitet die CustomListBox in Ordnung.

erklären kann jemand, warum ich diese Störung erhalten? Es ist möglich, meine individuelle Steuerung in anderen enthalten, obwohl sie in der gleichen Custom Controls Bibliothek sind, richtig?

Danke!

War es hilfreich?

Lösung

// Ich denke, es statischer Konstruktor in beiden Fällen sein soll, weil Abhängigkeitseigenschaft Metadaten immer überschreiben muß in statischem Konstruktor erfolgen.

// not public LineThicknessComboBox()
static LineThicknessComboBox()        
{
            DefaultStyleKeyProperty.OverrideMetadata(
               typeof(LineThicknessComboBox)
                        , new FrameworkPropertyMetadata(
                              typeof(LineThicknessComboBox)));
}
  

Anrufe an OverrideMetadata sollten nur innerhalb der statischen Konstruktoren ausgeführt werden des Typs, der sich als der forType Parameter dieser Methode, oder durch ähnliche Instanziierung zur Verfügung stellt. Der Versuch, Änderung von Metadaten nach Instanzen des Eigentümers Art existieren keine Ausnahmen erhöhen, aber in inkonsistenten Verhalten im Eigenschaftensystem führen wird.

FROM MSDN

Andere Tipps

Sie könnten in ein Problem in Sie mit Designmode und Code sind Konstruktor ausgeführt werden. Ich kann nicht mit Sicherheit sagen, wie ich meinen gerechten Anteil an Problemen mit WPF User Controls und der Entwurfsoberfläche gehabt habe, und alle von ihnen haben kryptische Fehler wie diese.

Die Lösung ist die System.ComponentModel.DesignerProperties Klasse zu verwenden, um zu überprüfen, ob Sie im Entwurfsmodus sind, und wickeln Sie beliebigen Code, der in einem nicht-Funktion im Design-Modus funktioniert, wenn Block seine Ausführung zu verhindern:

namespace CustomControls
{
    public class LineThicknessComboBox : ComboBox
    {
        public LineThicknessComboBox()
        {
            // Design-mode capable code...

            if (DesignerProperties.GetIsInDesignMode(this)) return;

            // Design mode incapable code...

            DefaultStyleKeyProperty.OverrideMetadata(typeof(LineThicknessComboBox)
                        , new FrameworkPropertyMetadata(typeof(LineThicknessComboBox)));

        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top