Domanda

Ho una libreria di controllo personalizzato, dove ho diversi controlli personalizzati che uso nel mio principale dell'applicazione. Ho un semplice controllo personalizzato che permette agli selezionare i valori di spessore penna utente da un combobox. Ora, sto creando un nuovo controllo personalizzato, sulla base di una casella di riepilogo, e voglio includere il combobox spessore penna in ItemTemplate del nuovo controllo personalizzato.

sto ottenendo questo errore:

"Impossibile creare un'istanza di 'LineThicknessComboBox' definito in CustomControls assemblaggio ... eccezione è stata generata dalla destinazione di una chiamata errore in oggetto. '10_T' nel file di markup 'CustomControls; componente / Temi / CustomListBox. General.xaml'.

Ecco il XAML e codice dietro per il LineThicknessComboBox:

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

        }
    }
}

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

Ecco il codice XAML e codebehind per il mio nuovo CustomListBox:

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

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

Ed ecco la mia 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>

Sto pensando ho qualche tipo di problema di riferimento, ma non riesco a capire cosa è sbagliato. Il programma viene compilato ed eseguito senza avvisi / errori, ma quando la CustomListBox è creato nella mia applicazione principale, ottengo l'errore di cui sopra. Senza includere il LineThicknessComboBox, il CustomListBox funziona bene.

Qualcuno può spiegare perché sto ottenendo questo errore? E 'possibile includere il mio controllo personalizzato in un altro, anche se sono nella stessa libreria controllo personalizzato, giusto?

Grazie!

È stato utile?

Soluzione

// penso che dovrebbe essere costruttore statico in entrambi i casi, perché i metadati proprietà di dipendenza assoluta deve sempre essere fatto in costruttore statico.

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

Le chiamate a OverrideMetadata deve essere eseguita solo all'interno dei costruttori statici del tipo che si fornisce come parametro forType di questo metodo, oppure attraverso esemplificazione simile. Il tentativo di modificare i metadati dopo i casi di tipo proprietario esistere non solleverà eccezioni, ma si tradurrà in comportamenti incoerenti nel sistema di proprietà.

da MSDN

Altri suggerimenti

Si potrebbe essere in esecuzione in un problema con il codice DesignMode e sei costruttore. Non posso dire per certo, come ho avuto la mia parte equa dei problemi con controlli utente WPF e di progettazione, e tutti hanno errori criptici come questo.

La soluzione è quella di utilizzare la classe System.ComponentModel.DesignerProperties per verificare se si è in modalità di progettazione, e avvolgere qualsiasi codice che non funziona nella modalità di progettazione in un blocco if per evitare che l'esecuzione:

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

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