La subclasificación de WPF UserControl no funciona en todos los proyectos

Hola, he creado algunos controles de usuario subclasificados basados ​​en la información que se encuentra aquí; http://csharpsimplified.wordpress.com/2011/09/21/subclassing-wpf-user-control/ pero me encuentro con un problema.

Aquí está mi clase base contenida en un proyecto TestUserControl.

namespace TestUserControl
{
    public class BaseDataGridControl : UserControl
    {
        protected BaseDataGridControl()
        {
        }
    }
}

y aquí está mi clase concreta;

<view:BaseDataGridControl x:Class="TestUserControl.Concrete"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:view="clr-namespace:TestUserControl"      
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <Button Height="20" Width="60" Margin="12,12,228,268" />
    </Grid>
</view:BaseDataGridControl>

y este código de control detrás se ve así;

public partial class Concrete : BaseDataGridControl
{
    public Concrete()
    {
        InitializeComponent();
    }
}

Puedo soltar mi clase concreta en una ventana en el mismo proyecto TestUserControl sin ningún problema;

<Window x:Class="TestUserControl.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" xmlns:my="clr-namespace:TestUserControl">
    <Grid>
        <my:Concrete HorizontalAlignment="Left" Margin="88,39,0,0" x:Name="concrete1" VerticalAlignment="Top" />
    </Grid>
</Window>

todo esto funciona bien.

El problema es cuando intento usar la clase concreta en otro proyecto.

Si creo otro proyecto (WPFApplication1) y creo una clase basada en la clase concreta, por ejemplo

namespace WpfApplication1
{
    public class SubClass : Concrete
    {
    }
}

cuando intento soltar esto en una ventana en el proyecto WPFApplication1 obtengo un ;

"El enumerador no es válido porque la colección cambió"

Si trato de agregarlo a través de XAML, obtengo un

'El componente 'WpfApplication1.SubClass' no tiene un recurso identificado por el URI '/TestUserControl;component/concrete.xaml'.

mensaje de error.

El proyecto WPFApplication1 tiene una referencia al proyecto TestUserControl.

¿Alguien tiene alguna pista de por qué esto funciona dentro del proyecto en el que se definió el control de usuario, pero tan pronto como intenta subclasificarlo en un proyecto separado, falla?

Probé esto en VS2010 y VS11 beta con los mismos malos resultados.

No estoy usando la reflexión ni accediendo a ninguna colección en los constructores de las clases, el código es lo que ves aquí.

Tengo un proyecto de prueba que demuestra este problema, ¿si ayudaría?

Gracias ....

preguntado el 03 de mayo de 12 a las 17:05

proyecto de muestra se puede descargar de skydrive.live.com/… -

¿Intentaste... público? parcialmente clase Subclase: ¿Concreto? -

Lo hice pero no hace ninguna diferencia. -

1 Respuestas

Me encontré con un problema similar. Tengo un proyecto con mi interfaz de usuario base y algunos elementos son controles de usuario. (Llamamos a este proyecto "BaseUI"). En mi segundo proyecto (lo llamaremos "SubProj"), puedo agregar las referencias y agregarlo al xaml en Visual Studio sin problemas, pero no puedo usar Blend para ver los cambios. Y ahora no puedo usarlo para algunas de mis ediciones más complejas.

Produce el error "[el nombre del componente va aquí] no existe en el espacio de nombres [su espacio de nombres al que se hace referencia]"

La solución que encontré probablemente le permitirá heredarla también en su subproyecto.

En lugar de intentar usar la clase directamente desde el ensamblado al que se hace referencia, puede agregar el código a su ensamblado actual mediante un vínculo. El enlace hace que el control actúe como si estuviera en el proyecto existente, sin embargo, el código es del proyecto base. Cualquier cambio en él afecta a todos los enlaces. Debería poder heredar de eso localmente sin los problemas de pasar por proyectos.

Así es como se hace:

  1. Cree el control base en su proyecto "BaseUI"
  2. Haga clic derecho en su "SubProj" y agregue un elemento existente
  3. Busque el archivo .xaml del proyecto "BaseUI" para el control de usuario que desea.
  4. Haga clic en la flecha al lado del botón "Agregar" y elija "Agregar como enlace"

Respondido 10 Feb 15, 06:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.