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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    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 confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

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

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

    Pourquoi tu ne crées pas simplement une ChildWindow ?

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    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 confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 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
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    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 confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 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();
       }
       ...
    }

+ 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