Question

J'ai une bibliothèque de contrôle personnalisé où j'ai plusieurs contrôles personnalisés que j'utilise dans mon application principale. J'ai un contrôle personnalisé simple qui permet à l'utilisateur de sélectionner des valeurs d'épaisseur de stylo d'un combobox. Maintenant, je suis en train de créer un nouveau contrôle personnalisé, basé sur une zone de liste, et je veux inclure l'épaisseur du stylo dans combobox ItemTemplate du nouveau contrôle personnalisé.

Je reçois cette erreur:

"Impossible de créer une instance de « LineThicknessComboBox » défini dans CustomControls d'assemblage ... Exception a été levée par la cible d'un appel d'erreur à l'objet. « 10_T » dans le fichier de balisage « CustomControls; composant / Thèmes / CustomListBox. General.xaml ».

Voici le XAML et le code derrière le LineThicknessComboBox:

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

        }
    }
}

et 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>

Voici le XAML et codebehind pour mon nouveau CustomListBox:

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

et 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>

Et voici mon 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>

Je pense que j'ai une sorte de problème de référence, mais ne peut pas comprendre ce qui est faux. Le programme compile et fonctionne sans avertissements / erreurs, mais lorsque le CustomListBox est créé dans mon application principale, je reçois l'erreur ci-dessus. Sans y compris le LineThicknessComboBox, le CustomListBox fonctionne très bien.

Quelqu'un peut-il expliquer pourquoi je reçois cette erreur? Il est possible d'inclure mon contrôle personnalisé dans un autre, même si elles sont dans la même bibliothèque de contrôle personnalisé, correct?

Merci!

Était-ce utile?

La solution

// je pense qu'il devrait être constructeur statique dans les deux cas en raison primordiale de métadonnées de propriété de dépendance doit toujours être fait dans le constructeur statique.

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

Les appels à OverrideMetadata ne doit être effectué dans les constructeurs statiques du type qui fournit lui-même en tant que paramètre forType de cette méthode, ou par instanciation similaire. Toute tentative de modifier les métadonnées après les instances du type de propriétaire existent ne soulèvera pas des exceptions, mais entraînera des comportements incompatibles dans le système de la propriété.

MSDN

Autres conseils

Vous pouvez exécuter un problème avec DesignMode et code constructeur que vous êtes la. Je ne peux pas dire avec certitude, comme je l'ai eu ma juste part des problèmes avec les contrôles utilisateur WPF et la surface de conception, et tous ont des erreurs énigmatiques comme celui-ci.

La solution est d'utiliser la classe System.ComponentModel.DesignerProperties pour vérifier si vous êtes en mode de conception, et envelopper tout code qui ne fonctionne pas en mode de conception dans un bloc si pour l'empêcher de courir:

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)));

        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top