IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

hériter d'une classe Window personnalisée et générique.


Sujet :

Windows Presentation Foundation

  1. #1
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut hériter d'une classe Window personnalisée et générique.
    Bonjour,

    J'aimerai que ma classe Window1 hérite d'une classe CustomWindow<T> (générique) au lieu de Window. Est-ce possible en WPF ?

    Merci.
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    A priori, je dirais oui: tu as essayé ? Tu as des erreurs ?

  3. #3
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Heu, le truc c'est que je ne sais pas comment on fait ? J'ai essayé de changer la classe mère dans le code behind, mais le code est écrasé à la compilation (le code généré par le XAML écrase mon code).
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

  4. #4
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par maa Voir le message
    J'ai essayé de changer la classe mère dans le code behind, mais le code est écrasé à la compilation


    Normalement, si tu met ca:

    public partial class Window1 : CustomWindow<T>


    Ca marche pas ?

  5. #5
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Non. A la compilation, le XAML régénère le code behind et CustomWindow<T> est écrasé et remplacé par Window...
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Salut,

    vu que les classes sont partielles, il faut changer le nom et la classe de base dans le fichier cs et dans le fichier du designer (Vu qu'on ne peut y acceder normalement, clic droit sur InitializeComponents et 'Go to definition').

    Je viens d'essayer, ca marche sur ma machine.

  7. #7
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Oui mais quand on recompile, le nom de classe de ma base est écrasée par "Window" (du moins chez moi...)
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

  8. #8
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par maa Voir le message
    Oui mais quand on recompile, le nom de classe de ma base est écrasée par "Window" (du moins chez moi...)
    Etrange car si tu change la classe de base dans le fichier .cs et dans le designer.cs, il devrait pas avoir ce comportement. Tu me une exception, possible mais renommer en Window, c'est pas normal.

    J'avais déjà fait le test avec la Beta 2 de VS 2008 et ca marchait bien (bon ok, je n'héritais pas d'une classe générique)

    Tu as essayé de faire un clean de ta solution avant de builder ?

  9. #9
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Pourquoi parles-tu de 2 fichier .cs : le fichier .cs et dans le designer.cs

    Je change le nom de la classe de base dans le fichier Window1.g.cs et celui-ci est écrasé par "Window" à chaque compilation même en ayant fait un clean juste avant...
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    C'est etrange comme comportement.

    Pour ma part, sur la release 2008 express, si je change le Window en Window1<string> par exemple, le compilo m'insulte ("Partial declarations of 'WpfApplication1.Window1' must not specify different base classes"), mais ne change rien.

    Pour les cs, pour que ca marche il faut changer le code de la form (window1.xaml.cs) et le code designer (window1.g.cs).

  11. #11
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par maa Voir le message
    Je change le nom de la classe de base dans le fichier Window1.g.cs et celui-ci est écrasé par "Window" à chaque compilation même en ayant fait un clean juste avant...
    Ok donc on va reprendre depuis le début: les fichiers .g.cs, ce sont les fichiers générés par le compilateurs lorsqu'il prend le XAML, le convertit en C# et le mixe avec le fichier de code behind associé. Si tu modifies ce fichier, il n'est pas surprenant qu'il soit remodifié car si tu ne change pas le reste dans le XAMl et/ou le fichier de code, c'est comme si tu n'avais rien fait...

    Ce que tu veux faire est possible: regarde comment j'ai fait ici:

    https://connect.microsoft.com/feedba...997&SiteID=477

    Seul problème que j'avais (et qui est un bug): l'intellisense ne marche pas/plus.

  12. #12
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Ton lien n'est plus valide :

    Le contenu que vous avez demandé est introuvable ou vous ne disposez pas des autorisations nécessaires pour le consulter.
    Si je modifie le fichier .xaml.cs (en ajoutant le nom de la classe de base générique) et le fichier .g.cs (en modifiant le nom de la classe de base), j'obtiens la même erreur que SirJulio.
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Juste pour etre precis, j'ai l'erreur uniquement si je change qu'un seul des deux fichiers. En changeant les deux, ca passe, compile et tourne sans probleme.

    D'ailleurs, il n'y aurait pas dans VS pas_express, un wizard pour ajouter une nouvelle form qui herite d'une form existante (il me semblait que ca existait sous 2005) ?

  14. #14
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Moi j'ai l'erreur quand je modifie les 2 fichiers...
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

  15. #15
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par maa Voir le message
    Ton lien n'est plus valide :



    Si je modifie le fichier .xaml.cs (en ajoutant le nom de la classe de base générique) et le fichier .g.cs (en modifiant le nom de la classe de base), j'obtiens la même erreur que SirJulio.
    Arf, mince.

    Voila les étapes qu'il y a dans le lien:
    - Create a new WPF application

    - Create a simple class named Common (and which inherit from Window):
    public class Common : Window
    {
    public Common()
    : base()
    { }
    }

    - In Window1.xaml.cs, remplace :
    public partial class Window1 : Window

    by:

    public partial class Window1 : Common

    - Replace the content of Window1.xaml by this one:
    <local:Common x:Class="HeritageWindiwsFormsWPF.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:HeritageWindiwsFormsWPF"
    Title="Window1" Height="300" Width="300">
    <Grid>

    </Grid>
    </local:Common>

    The application compiles and runs fine. But when you go at the first <local: and you press Control+Space, Intellisense does not display all the types (Common and Window1)availabe
    In the grid, if you add:

    <local:

    you will see that intellisense is working fine

  16. #16
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Là tu modifies le XAML, mais je pense que je ne peux pas le faire avec une classe générique, non ?
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

  17. #17
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par maa Voir le message
    Là tu modifies le XAML, mais je pense que je ne peux pas le faire avec une classe générique, non ?
    Bah, faudrait tester mais je pense que ca devrait marcher aussi....

  18. #18
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Citation Envoyé par Thomas Lebrun Voir le message
    Bah, faudrait tester mais je pense que ca devrait marcher aussi....
    Je ne pense, rien dans le XAML ne permet de définir un type générique. Si on reprend ton exemple tu ne peux avoir de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <local:Common<T> x:Class="HeritageWindiwsFormsWPF.Window1<T>" ... />
    Si dans ton XAML tu ne peux pas gérer le type parametre du générique le compilateur lors de la conversion XAML/C# ne peux savoir qu'il faut un générique ...
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  19. #19
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par dev01 Voir le message
    Je ne pense, rien dans le XAML ne permet de définir un type générique. Si on reprend ton exemple tu ne peux avoir de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <local:Common<T> x:Class="HeritageWindiwsFormsWPF.Window1<T>" ... />
    Si dans ton XAML tu ne peux pas gérer le type parametre du générique le compilateur lors de la conversion XAML/C# ne peux savoir qu'il faut un générique ...
    Sur le principe, je suis d'accord. Maintenant, il est toujours possible de voir si en créant sa propre MarkupExtension cela peut fonctionner. Un truc du genre:

    <local:{CustomExtension Common<T>} x:Class="HeritageWindiwsFormsWPF.Window1<T>" ... />

    Je garantie pas que cela marche mais cela se tente à l'occasion

  20. #20
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Mais pourtant dans les précédents posts, vous arriviez à faire hériter d'une classe générique sans modifier le XAML n'est ce pas ? (En modifiant seulement le fichier .cs et le fichier .cs généré)
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/07/2017, 09h53
  2. Réponses: 5
    Dernier message: 29/01/2008, 19h22
  3. [débutant]hériter d'une classe visuel
    Par cendretp dans le forum NetBeans
    Réponses: 2
    Dernier message: 13/08/2007, 22h14
  4. Comment hériter d'une class ayant un construteur ?
    Par mobscene dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/07/2007, 18h56
  5. Réponses: 7
    Dernier message: 25/03/2005, 14h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo