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

C# Discussion :

C# et WPF : la classe System.Windows.Shapes.Rectangle ne peut être héritée car elle est sealed.


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 163
    Points : 120
    Points
    120
    Par défaut C# et WPF : la classe System.Windows.Shapes.Rectangle ne peut être héritée car elle est sealed.
    Bonjour à tous,

    Dans le cadre de la réalisation d’un jeu d’échec avec Silverlight et donc WPF,

    Je souhaiterai créer une classe « Pièce » qui hériterai du type de dessin de Rectangle en WPF : System.Windows.Shapes.Rectangle, pour faciliter l’implémentation du dessin et de l’association à des événements (clic, survol) de mes pièces.

    Manque de pot la classe System.Windows.Shapes.Rectangle est sealed :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public sealed class Rectangle : Shape
    Source : http://msdn.microsoft.com/fr-fr/libr...rectangle.aspx

    Se qui veut dire quelle ne peut pas être héritée (avoir des classes qui en découle).

    Je suppose que Microsoft l’a fait exprès pour de bonne raison mais… est-ce qu’il y a une autre méthode ? Ou comment faire pour associer des événements à ma pièce après, sans la faire héritée ?

    Si quelqu'un à une idée je suivrai ces conseils.

    Merci d'avance.

  2. #2
    Membre confirmé Avatar de jacky01
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 537
    Points : 527
    Points
    527
    Par défaut
    Bonjour,

    Pourquoi ne déclare-tu pas les évènements directement dans ta classe "pièce" ?

    Ceci est un tuto pour instancier tes propres évènements :
    http://freddyboy.developpez.com/dotnet/articles/events/
    Je fais ce que je dis et je dis ce que je veux .

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 163
    Points : 120
    Points
    120
    Par défaut
    Yop,

    Oui, je pourrais mais le problème, c'est que ce que je voulais faire c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class Piece : Rectangle
    {
          ...
          public Piece() {
                  this.MouseDown += new MouseEventHandler(this.JouerUnCoup);
          }
     
          public JouerUnCoup(event e ...){...}
          ....
    }
    Alors que la je suis obligé de déclarer un rectangle à l'intérieur de ma classe,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class Piece
    {
          ....
          private Rectangle _rectangle;
     
          public Piece() {
                  _rectangle = ....;
          }
          ....
     
    }
    Idem pour la classe System.Windows.Controls.Image.

    Je ne comprend pas d'autant qu'en Windows Form, on pouvait hériter de PictureBox par exemple...

    Qu'est-ce qui a pris Microsoft de verrouiller ces classes de sorte à ce qu'on ne puisse pas en faire des classes enfants ??? Performance ? Sécurité ? Exclusivité ?

    Ou alors, il y a une nouvelle manière de développer sans héritage avec WPF ?

    C'est épuisant...

  4. #4
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 114
    Points : 120
    Points
    120
    Par défaut
    la classe rectangle du WPF gere les evenement souris et clavier.

    Puisque c'est du WPF pourquoi ne pas travailler en XAML?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <Border  BorderBrush="black"  BorderThickness="5" >
            <Grid>
            <Rectangle MouseDown ="Rectangle_MouseDown" Fill="white"/>
            <Image Width="200" Height="200" IsHitTestVisible="False"/>    
            </Grid>
    </Border>
    IsHitTestVisible permet de rendre un control invisible au evenement souris. Donc même si tu click sur l'image, c'est le rectangle qui recuperera l'evenement.

    Evite de trop comparer WPF et Winforms, Même si le second s'inspire du premier, Ca n'a absolument rien à voir (L'un utilise DirectX l'autre GDI).

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 163
    Points : 120
    Points
    120
    Par défaut
    Merci de ta réponse.

    Je ne veux pas travailler directement en XAML parce qu'il faut que je gère une série d'objet, par exemple : 64 cases pour l'échiquier, je ne souhaite pas faire de "copier/coller" de balise ou de bloc. Et puis car je vais avoir besoin de deux échiquiers graphiquement, car c'est un jeu des Échecs d'Alice que je fais, ce qui complexifie un peu plus les choses. Donc je préfère gérer tout ça de manière dynamique.

    De plus, je n'ai pas de grande expérience de C# et .NET.

    Et comme WPF est récent par rapport à WindowsForms, j'ai encore du mal à me documenter sur les nouveaux design patterns apportés par C#/WPF qui rendent obsolètes et vide de sens d'anciennes méthodes.

    Merci pour cette observation :
    IsHitTestVisible permet de rendre un control invisible au événement souris. Donc même si tu click sur l'image, c'est le rectangle qui recuperera l'evenement.
    J'avais pensé que le problème se poserait mais je n'avais pas cherché la solution.

  6. #6
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 114
    Points : 120
    Points
    120
    Par défaut
    rien ne t'empeche de créer tes composants en XAML puis de coder un conteneur. C'est beaucoup plus simple. En plus tu peux t'aider de l'evenement PreviewMouseDown qui te permet de t'affranchir des ajouts d'écouteur à la volé.

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/05/2014, 15h25
  2. [WPF]BackgroundImage du System.Windows.Control
    Par Babas007 dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 12/10/2010, 23h17
  3. Réponses: 1
    Dernier message: 04/03/2010, 17h08
  4. classe héritée de system.windows.shapes.polygon
    Par eldrad95 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 18/01/2010, 15h34
  5. System.Windows.Shapes est inconnu.
    Par deebou dans le forum C#
    Réponses: 12
    Dernier message: 11/03/2009, 19h47

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