2009-10-18 5 views
0

J'ai une bibliothèque de contrôle personnalisée 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 à partir d'une zone de liste déroulante. Maintenant, je crée un nouveau contrôle personnalisé, basé sur une liste, et je veux inclure la combobox d'épaisseur du stylo dans ItemTemplate du nouveau contrôle personnalisé.WPF: Erreur lors de l'utilisation d'un contrôle personnalisé dans le ItemTemplate d'un autre contrôle personnalisé

Je reçois cette erreur:

« ne peut pas 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, composante/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 LineThickne ssCombobox.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 ma 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 J'ai un problème de référence, mais je n'arrive pas à comprendre ce qui ne va pas. Le programme compile et s'exécute sans aucun avertissement/erreur, mais lorsque le CustomListBox est créé dans mon application principale, j'obtiens l'erreur listée ci-dessus. Sans inclure LineThicknessComboBox, la CustomListBox fonctionne correctement.

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 s'ils sont dans la même bibliothèque de contrôle personnalisée, est-ce correct?

Merci!

+0

"Exception a été levée par la cible d'un appel." Percer dans InnerException (vous devrez peut-être explorer plus d'un niveau) et vous devriez trouver une exception plus significative.Cela peut rendre l'erreur évidente une fois que vous la voyez, ou à défaut si vous pouviez l'afficher, cela aiderait avec le diagnostic. – itowlson

Répondre

1

// Je pense que cela devrait être un constructeur statique dans les deux cas car la substitution de métadonnées de propriété de dépendance doit toujours être faite dans le constructeur statique.

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

Calls to OverrideMetadata should only be performed within the static constructors of the type that provides itself as the forType parameter of this method, or through similar instantiation. Attempting to change metadata after instances of the owner type exist will not raise exceptions, but will result in inconsistent behaviors in the property system.

DE MSDN

+0

Je vais donner un coup de feu quand je rentre à la maison plus tard aujourd'hui. Merci pour les heads up, je ne sais pas pourquoi mes constructeurs ne sont pas déclarés statiques. – stevosaurus

+0

Cela a résolu mon problème, merci Akash. – stevosaurus

0

Vous avez peut-être rencontré un problème avec DesignMode et du code dans votre constructeur. Je ne peux pas dire avec certitude, car j'ai eu ma part de problèmes avec les contrôles utilisateur WPF et la surface de conception, et tous ont des erreurs cryptiques comme celle-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))); 

     } 
    } 
} 
+0

Je ne pense pas que ce soit mon problème, puisque je reçois l'erreur à l'exécution. Merci pour la réponse si. – stevosaurus

Questions connexes