Pregunta

Tengo una biblioteca de controles personalizados en el que tengo varios controles personalizados que utilizo en mi aplicación principal. Tengo un control personalizado simple que permite a los selectos valores de espesor de la pluma de usuario desde un cuadro combinado. Ahora, estoy creando un nuevo control personalizado, basado en un cuadro de lista, y quiero incluir en el cuadro combinado grosor del lápiz en la nueva ItemTemplate de control personalizado.

Estoy consiguiendo este error:

"No se puede crear instancia de 'LineThicknessComboBox' se define en CustomControls montaje ... Se inició una excepción por el destino de una invocación de error en el objeto. '10_T' en el archivo de anotación 'CustomControls; componente / Temas / CustomListBox. General.xaml'.

Aquí está el XAML y código detrás de la LineThicknessComboBox:

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

        }
    }
}

y en 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>

Aquí está el XAML y código subyacente para mi nuevo CustomListBox:

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

y en 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>

Y aquí está mi 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>

Estoy pensando que tienen algún tipo de problema de referencia, pero no puedo averiguar lo que está mal. Las compilaciones de programas y se ejecuta sin advertencias / errores, pero cuando se crea el CustomListBox en mi aplicación principal, me sale el error enumerado anteriormente. Sin incluir el LineThicknessComboBox, la CustomListBox funciona bien.

Puede alguien explicar por qué estoy recibiendo este error? Es posible incluir mi control personalizado en otra, a pesar de que están en la misma biblioteca de controles personalizados, correcto?

Gracias!

¿Fue útil?

Solución

// i creo que debería ser constructor estático en ambos casos debido a los metadatos propiedad de dependencia anulando siempre se debe hacer en el constructor estático.

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

Las llamadas a OverrideMetadata sólo debe llevarse a cabo dentro de los constructores estáticos del tipo que proporciona a sí mismo como el parámetro paratipo de este método, o a través de instanciación similar. Intentar cambiar los metadatos después de las instancias del tipo existen propietario no va a lanzar excepciones, pero dará lugar a comportamientos inconsistentes en el sistema de propiedad.

FROM MSDN

Otros consejos

Es posible que se ejecuta en un problema con DesignMode y el código en el que eres constructor. No puedo decir con certeza, ya que he tenido mi parte justa de los problemas con los controles de usuario de WPF y la superficie de diseño, y todos ellos tienen errores crípticos como este.

La solución es utilizar la clase System.ComponentModel.DesignerProperties para comprobar si se encuentra en modo de diseño, y envolver cualquier código que no funciona en el modo de diseño en un bloque if para impedir que se ejecute:

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

        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top