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

Silverlight Discussion :

Gestion d'evennements dans un ControlTemplate


Sujet :

Silverlight

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    Points : 27
    Points
    27
    Par défaut Gestion d'evennements dans un ControlTemplate
    Bonjour,

    Je développe une application en Silverlight 4, et pour des besoins évidents je suis dans l'obligation de créer mes propres contrôles. Alors je risque de m'embrouiller entre Custom Control, ControlTemplate et UserControl mais ce que je souhaite c'est créer une fenêtre de chat personnalisable. Voila pour l'intro, et voici mon code de contrôle(désolé pour la longueur):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
        <Style TargetType="test:ChatWindow">
            <Setter Property="Height" Value="640"/>
            <Setter Property="Width" Value="480"/>
            <Setter Property="Background" Value="White"/>
            <Setter Property="BorderBrush" Value="DarkGray"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="test:ChatWindow">
                        <Grid x:Name="CHAT_grid" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="25"/>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="30"/>
                            </Grid.RowDefinitions>
     
                            <Border Grid.RowSpan="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" BorderThickness="2" BorderBrush="{TemplateBinding BorderBrush}"
                                    CornerRadius="4" Background="{TemplateBinding Background}"/>
     
                            <Grid Grid.Row="0">
                                <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
                                    <TextBlock x:Name="Chat" Text="Chat to: " FontFamily="Georgia" FontWeight="Bold" Foreground="White" HorizontalAlignment="Left" 
                                               VerticalAlignment="Center" Margin="4"/>
                                    <ComboBox x:Name="Friend_chat_list" Width="90"/>
                                </StackPanel>
                                <Button x:Name="CloseButton" Content="X" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="4"/>
                            </Grid>
     
                            <Grid Grid.Row="1">
                                <ScrollViewer HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="4"/>
                            </Grid>
     
                            <Grid Grid.Row="2">
                                <TextBox x:Name="UserMessage" Height="20" Width="120"  HorizontalAlignment="Left" Margin="4" />
                                <Button x:Name="SendMessage" Content="Send!" Width="70" Height="20" HorizontalAlignment="Right"  Margin="4"/>
                            </Grid>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    Et voici le Code-behind en C#:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    namespace test
    {
        public class ChatWindow : ContentControl
        {
            public event EventHandler<EventArgs> WindowClosed;
     
            private TextBox _inputText;
            private Button _sendButton;
            private Button _closeButton;
            private ComboBox _friendList;
     
            public ChatWindow()
                : base()
            {
                DefaultStyleKey = typeof(ChatWindow);
            }
     
            public override void OnApplyTemplate()
            {
                base.OnApplyTemplate();
                _inputText = GetTemplateChild("UserMessage") as TextBox;
                _sendButton = GetTemplateChild("SendMessage") as Button;
                _friendList = GetTemplateChild("Friend_chat_list") as ComboBox;
                _closeButton = GetTemplateChild("CloseButton") as Button;
     
                DefineButtonsEvents();
            }
     
            private void DefineButtonsEvents()
            {
                if (_closeButton != null)
                    _closeButton.Click += new RoutedEventHandler(closeButton_Click);
            }
     
            private void closeButton_Click(object sender, RoutedEventArgs e)
            {
                OnWindowClosed();
            }
     
            protected virtual void OnWindowClosed()
            {
                EventHandler<EventArgs> handler = WindowClosed;
     
                if (handler != null)
                {
                    Debug.WriteLine("Est entre ici");
                    handler(this, EventArgs.Empty);
                }
            }
        }
    }
    Voici mon appel a mon contrôle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <test:ChatWindow Height="300" Width="200" Background="DarkBlue" BorderBrush="Black" Grid.Row="3" />
    Comme vous avez pu le voir dans le xaml Je dispose d'une ComboBox, d'un bouton pour fermer, d'un ScrollViewer, d'une Textbox et d'un bouton d'envoi.

    J'ai essayer en suivant ce tuto, et ca m'a beaucoup aider dans un premier temps, mais alors pour les gestions d'évènements je ne comprends plus rien. J'ai essayer plusieurs choses différentes, comme dans le code C# ci-dessus, mais rien ne fonctionne.

    Donc si quelqu'un pouvait m'indiquer un lien ou me montrer comment gérer un simple évènement dans un custom control, et changer/appeler les propriétés de celui-ci d'un autre endroit je lui en serais grandement reconnaissant.

  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Ici le ContentControl n'est pas la meilleure solution.

    Pourquoi tu ne crées pas simplement une ChildWindow ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    Points : 27
    Points
    27
    Par défaut
    Ce que je développe doit s'inscrire au sein d'un autre projet beaucoup plus important. Cette fonctionnalité de chat ne sera qu'une sorte de plu-gin, parmi d'autres, qui viendra se greffer sur un morceau de mon interface. Avec ce que j'ai pu tester avec les ChildWindow(car j'en utilise) cela ne correspond vraiment pas a mes besoins. J'aurais besoin par la suite de créer des sortes de fenêtres comme badger l'a montrer dans son tutoriel, mais pour l'instant je trouvais la création d'un chat plus "simple" a réaliser.

  4. #4
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Bon ben le truc c'est de faire un ContentControl qui représente ta fenêtre (avec les bordures et tout ce que tu veux) et de placer un ContentPresenter là où tu voudra afficher le contenu de ta fenêtre.

    Ensuite tu crées un nouveau UserControl qui hérite de ta custom Window et dedans tu places ta ComboBox, ton bouton et toutes tes affaires. Tu pourras donc facilement gérer les events directement dans le code behind de ton UserControl.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    Points : 27
    Points
    27
    Par défaut
    Je crois avoir compris ce que tu disais dans la première partie de ton message, mais pour la deuxième pas du tout:

    Ensuite tu crées un nouveau UserControl qui hérite de ta custom Window et dedans tu places ta ComboBox, ton bouton et toutes tes affaires. Tu pourras donc facilement gérer les events directement dans le code behind de ton UserControl.
    Je ne suis pas sur d'avoir bien saisi ce que tu me recommandais.
    Pourrais-tu brièvement me faire un petit exemple de ce qui doit se trouver dans le generic.xaml(qui est un ressource dictionnary) et de comment je dois appeler celui-ci dans mon usercontrol en bindant des éléments telle une combobox, des boutons ou autres? Je ne demande pas quelque chose de fonctionnel mais simplement montrer l'ordre d'appel et de la syntaxe.

    Désole pour ces complications.

  6. #6
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    MyWindow.cs

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class MyWindow : ContentControl
    {
       public MyWindow()
       {
          this.DefaultStyleKey = typeof(MyWindow);
       }
    }

    generic.xaml

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <...>
       <ControlTemplate TargetType="local:MyWindow">
          <Border ...>
             <...>
                <ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}" ... />
             </...>
          </Border>
       </ControlTempalte>
    </...>

    MyCustomWindow.xaml + MyCustomWindow.cs

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <local:MyWindow x:Class="xxx.MyCustomWindow" ...>
       <Grid x:Name="LayoutRoot">
          <...>
          <ComboBox SelectionChanged="..." ... />
          <Button Content="Send!" ... />
          <... >
       </Grid>
    </local:MyWindow>

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class MyCustomWindow : MyWindow
    {
       public MyCustomWindow()
       {
          InitializeComponent();
       }
       ...
    }

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    Points : 27
    Points
    27
    Par défaut
    Encore merci pour ton temps et tes explications car cela marche parfaitement maintenant!
    Mais je me pose une question, quelles sont les limites et les grosses différences d'une telle méthode par rapport a ce que Florian Casabianca explique dans son tutoriel ? Si je souhaite davantage pousser l'autonomie de mes "objets", est-ce que je serais confronter a des problèmes en utilisant les ContentPresenter?

    Cordialement, Ephismen.

  8. #8
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Je viens de regarder et il fait exactement la même chose dans ton tutoriel.

    I. Création du Custom Control
    Il hérite de ContentControl et crée un style par défaut
    III-A. Simple fenêtre
    Il crée un UserControl qui hérite du ContentControl créé en I.
    (<SilverlightWindowsControls:Window).

    Dans l'autre partie il modifie le thème.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    Points : 27
    Points
    27
    Par défaut
    La partie dont je parlais c'était surtout les évènements comme le close button qu'il utilise ou alors les framework elements qui dans son tutoriel sont gérés dans sa classe Window.

  10. #10
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par Ephismen Voir le message
    La partie dont je parlais c'était surtout les évènements comme le close button qu'il utilise ou alors les framework elements qui dans son tutoriel sont gérés dans sa classe Window.
    Ah.
    Oui c'est normal, puisque la croix pour fermer sa fenêtre est un élément récurrent dans toutes les fenêtres, il était donc plus logique de le mettre dans le template de la fenêtre et de récupérer l'instance du bouton dans la méthode OnApplyTemplate.

    Etant donné que toi ton ComboBox et tes autres contrôles sont là pour une unique fenêtre il faut les mettre au niveau du UserControl plutôt que du Template.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    Points : 27
    Points
    27
    Par défaut
    D'accord je comprends. Je me posais la question car par la suite je vais devoir créer un nombre indéfini de fenêtres(Un peu comme ce qu'il a fait dans son tutoriel), en lisant une liste; et je me voyais mal faire ce que je viens de faire a la main! Car j'ai essayer la gestion d'évènements comme il l'a fait, mais je n'y arrive pas du tout. Enfin bon je verrais en temps voulu.

    Merci pour tes réponses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gestion evennement dans thread séparé
    Par arcan2z dans le forum C#
    Réponses: 4
    Dernier message: 21/05/2008, 16h14
  2. [Sécurité]Gestion des accès dans plusieurs bases
    Par vincentj dans le forum Débuter
    Réponses: 1
    Dernier message: 05/01/2005, 14h19
  3. Gestion des headers dans un Makefile
    Par Weren dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 09/11/2004, 10h44
  4. Gestion du blit dans un moteur2D
    Par Fry dans le forum DirectX
    Réponses: 2
    Dernier message: 01/11/2004, 02h05
  5. [VB6] Gestion des erreurs dans une dll
    Par zimba-tm dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 02/08/2004, 11h20

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