Domanda

Sto cercando di creare un UserControl che eredita da una classe generica. Non eredita direttamente da una classe generica, ma attraverso una classe intermedia che non utilizza generici. Questo viene compilato e funziona in fase di esecuzione, ma viene visualizzato un errore in fase di progettazione.

Ecco la mia classe genitrice generica:

Public Class GenericParent(Of T)
    Inherits UserControl
End Class

Ecco la mia classe genitore non generico:

Public Class NonGenericParent
    Inherits GenericParent(Of String)
End Class

Ecco il mio XAML:

<local:NonGenericParent x:Class="SilverlightApplication5.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:SilverlightApplication5"
    Width="400" Height="300">
    <StackPanel>
        <Button Content="Hello"/>
    </StackPanel>
</local:NonGenericParent>

Il parser IntelliSense fornisce i seguenti errori:

  1. La proprietà 'Larghezza' non è stata trovata nel tipo 'NonGenericParent'.
  2. La proprietà 'Height' non è stata trovata nel tipo 'NonGenericParent'.
  3. Il tipo "NonGenericParent" non supporta il contenuto diretto.

È come se IntelliSense non potesse vedere l'albero delle eredità oltre la classe GenericParent. Ho provato a specificare ContentPropertyAttribute direttamente sulla classe SilverlightApplication5.Page, la classe NonGenericParent e non funziona.

Ho letto che l'attributo TypeArguments non è supportato in Silverlight 2.0. Ecco perché ho creato la classe intermedia NonGenericParent.

Se qualcuno ha qualche idea su come silenziare questi errori, sarei desideroso di ascoltarli.

Aggiornamento: abbiamo aperto un ticket di supporto con MSFT, lo aggiornerò con qualunque sia la loro soluzione.

È stato utile?

Soluzione

Abbiamo ricevuto da Microsoft la notizia che è probabile che ciò non venga risolto nelle versioni future. Dopo aver risolto il problema nel tentativo di trovare il gruppo responsabile, sembra che questo problema appartenga al loro gruppo di sviluppatori WPF, che è da dove proviene la risposta "non risolverlo".

Nel frattempo, abbiamo aggiornato il nostro codice per strappare i generici dalle classi parent fino a quando immagino XAML 2009.

Altri suggerimenti

Non sono sicuro di Silverlight, ma questo viene compilato ed eseguito come previsto in c #:


class GenericObject[T] : UserControl
{
}

class StaticObject : GenericObject[Int32]
{
    public Int32 wide { get { return this.Width; } }
}

private void Form1_Load(object sender, EventArgs e)
{
    StaticObject so = new StaticObject();
    this.Text = so.wide.ToString();
}

Quindi, se si compila contro il clr, dovrebbe funzionare bene.

Potrebbe essere solo un bug di intellisense come stai suggerendo. Normalmente sconsiglio di ignorare gli avvisi del comiler, ma in questo caso sembra che l'avviso non sia valido.

modifica: le parentesi angolari sostituite con parentesi quadre causano l'estrazione di SO.

Nonostante sia al 2.0 Silverlight (e in particolare le modifiche VS2008 per Silverlight) sono ancora molto giovani. Ci sono ancora stranezze nella roba IDE.

Hai ancora il problema anche dopo una build riuscita?

Questo post sul blog sembra essere correlato al tuo problema:

http://blogs.msdn.com/b/wpfsldesigner/archive/2010/01/22/known-issue-controls-deriving-from-a- generic-base-class-deve-essere-in-separata-assembly.aspx

Per Silverlight sembra che tu debba avere 3 classi per farlo funzionare.

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