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 :

Accéder aux propriétés de MainWindow depuis une autre fenêtre [Débutant]


Sujet :

C#

  1. #1
    Candidat au Club
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Avril 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Accéder aux propriétés de MainWindow depuis une autre fenêtre
    Bonjour,

    Je me tourne vers le forum parce que je sèche sur un problème qui à la base ne me semblait pas compliqué...
    J'ai un programme composé de deux fenêtres : MainWindow et Fenetre2.
    Dans MainWindow, j'ai notamment un textblock (vide par défaut) et un bouton qui déclenche l'instanciation de Fenetre2.
    Fenetre2 est un formulaire (plusieurs textbox) avec un bouton de validation.

    Ce que je souhaiterais, c'est qu'en cliquant sur ce bouton, le texte de l'une des textbox soit récupéré comme texte du textblock de Mainwindow.

    Dans le sens inverse (depuis MainWindow je veux dire), j'y arriverai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fenetre2.textBox1.Text = textBlock1.Text
    ... mais depuis Fenetre2, je n'ai pas accès aux propriétés de MainWindow.
    Je ne peux donc pas écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MainWindow.textBlock1.Text = textBox1.Text
    Suites à des recherches, j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ((MainWindow)System.Windows.Application.Current.MainWindow).textBlock1.Text = textBox1.Text;
    ...mais j'ai une erreur à l'exécution : "Impossible d'effectuer un cast d'un objet de type 'MySmartPad.Creation' en type 'MySmartPad.MainWindow'."

    J'ai lu des trucs sur le Binding également, mais si j'en ai saisi les grands principes de fonctionnement pour les attributs d'une même fenêtre, je n'ai pas compris comment le faire fonctionner entre propriétés des deux fenêtres.
    Et puis ça m'a l'air d'être beaucoup d'efforts pour simplement appeler les propriétés de ma MainWindow.

    Si quelqu'un pouvait m'aider, ou au moins me donner la bonne orientation,

    Merci,
    Faguoren21

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Tu ne l'as pas précisé mais d'après ta dernière tentative il semblerait que tu soit en WPF, c'est bien ça (à ne pas confondre avec Windows Forms)? Dans ce cas tu as aussi une partie de code "XAML" qui décrit les objets de ton IHM en XML.
    Si tu avais utilisé Windows Forms, ton espace de nom aurait été "System.Windows.Forms"...

    D'après ce que tu as mis, il me semble que tu as fais ce qu'il fallait pour atteindre ton instance de "MainWindow" à partir de ta seconde fenêtre alors je ne comprends pas pourquoi tu as obtenu cette erreur. Pour mieux comprendre, il faudrait que tu nous fournisses plus de code pour voir comment sont faits les appels, notamment les codes de "App.xaml" et "App.xaml.cs".

  3. #3
    Candidat au Club
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Avril 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Merci de prendre le temps de t'intéresser à ma question.
    Effectivement, j'ai oublié de préciser (et c'est pourtant important) : il s'agit d'un projet WPF.

    Ci-dessous le détail du code demandé:
    MainWindow.xaml
    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
    <Window x:Class="MySmartPad.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MySmartPad" Height="700" Width="520" ResizeMode="CanMinimize" HorizontalAlignment="Left" Icon="/MySmartPad;component/testIcone.png" Background="White" AllowsTransparency="False" Name="mySmartPad" Closed="Closure">
        <Grid Height="656" Name="grid1" Width="506" Background="White">
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="655*" />
            </Grid.RowDefinitions>
            <TextBox Grid.Row="1" Height="586" HorizontalAlignment="Left" Margin="-4,69,0,0" Name="TB1" VerticalAlignment="Top" Width="511" BorderThickness="0" VerticalScrollBarVisibility="Visible" KeyDown="KeyDown_TB1" />
            <Button Content="Properties" Grid.Row="1" Height="26" HorizontalAlignment="Left" Margin="6,5,0,0" Name="button1" VerticalAlignment="Top" Width="96" Click="button1_Click" />
            <TextBlock Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="1,44,0,0" Name="textBlock1" Text="Title" VerticalAlignment="Top" Width="487" TextAlignment="Center" />
            <Button Content="?" Grid.Row="1" Height="27" Margin="461,4,29,0" Name="button2" VerticalAlignment="Top" Click="button2_Click" />
            <Button Content="!" Grid.Row="1" Height="27" HorizontalAlignment="Left" Margin="478,4,0,0" Name="button3" VerticalAlignment="Top" Width="16" Click="button3_Click" />
        </Grid>
    </Window>
    Le bout de MainWindow.xaml.cs qui instancie Fenetre2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
           private void button1_Click(object sender, RoutedEventArgs e)
           {
              fenetre Fenetre2 = new fenetre();
              Fenetre2.Show();
           }
    Fenetre2.xaml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <Window x:Class="MySmartPad.fenetre"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Fenetre2" Height="208" Width="425" Name="NewDoc" IsEnabled="True" ShowActivated="False" ResizeMode="NoResize" ShowInTaskbar="False" AllowsTransparency="False">
        <Grid>
            <TextBlock Height="18" HorizontalAlignment="Left" Margin="1,2,0,0" Name="textBlock1" Text="Title:" VerticalAlignment="Top" Width="32" />
            <TextBox Height="20" HorizontalAlignment="Left" Margin="1,17,0,0" Name="Prop_TB1" VerticalAlignment="Top" Width="402" BorderBrush="Black" SelectionBrush="Black" />
            <TextBlock Height="18" HorizontalAlignment="Left" Margin="1,42,0,0" Name="textBlock2" Text="Date:" VerticalAlignment="Top" Width="32" />
            <Button Content="Validate" Height="28" HorizontalAlignment="Left" Margin="33,122,0,0" Name="button2" VerticalAlignment="Top" Width="108" Click="button2_Click" />
            <Button Content="Cancel" Height="28" HorizontalAlignment="Left" Margin="256,122,0,0" Name="button3" VerticalAlignment="Top" Width="108" Click="button3_Click" />
            <DatePicker Height="23" HorizontalAlignment="Left" Margin="3,61,0,0" Name="datePicker1" VerticalAlignment="Top" Width="100" />
        </Grid>
    </Window>
    Et enfin, la tentative de renvoie de texte, depuis Fenetre2 vers MainWindow
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            private void button2_Click(object sender, RoutedEventArgs e)
            {
                button3.IsEnabled = false;
                title = Prop_TB1.Text;
                ((MainWindow)System.Windows.Application.Current.MainWindow).textBlock1.Text = Prop_TB1.Text;
                this.Hide();
            }
    Ce code compile sans problème.
    Je peux lancer le programme. Déclencher l'ouverture de Fenetre2. Mais lorsque je clique sur button2, le programme plante et j'ai comme message d'erreur:

    L'exception InvalidCastExcepion n'a pas été gérée (en titre de la fenêtre).
    Puis Impossible d'effectuer un cast d'un objet de type 'MySmartPad.fenetre' en type 'MySmartPad.MainWindow'.

    J'espère que cela va te permettre de m'aider.
    Merci,
    Faguoren

  4. #4
    Invité
    Invité(e)
    Par défaut
    OK, mais tu ne m'as pas passé le code que je t'avais demandé : celui des "app.xaml".
    C'est dans cette partie que "MainWindow" est définie et je pense que c'est ta "Fenetre2" (de type "MySmartPad.fenetre") qui est définie en tant que principale et non pas la fenêtre de type "MySmartPad.MainWindow". C'est certainement la raison pour laquelle il te fait cette exception.

  5. #5
    Candidat au Club
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Avril 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Oups... autant pour moi, je suis allé trop vite !

    Alors App.xaml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <Application x:Class="MySmartPad.App"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 StartupUri="MainWindow.xaml">
        <Application.Resources>
     
        </Application.Resources>
    </Application>
    et App.xaml.cs :

    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
    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Data;
    using System.Linq;
    using System.Windows;
     
    namespace MySmartPad
    {
        /// <summary>
        /// Logique d'interaction pour App.xaml
        /// </summary>
        public partial class App : Application
        {
        }
    }
    J'espère que je n'ai rien oublié cette fois !

    Pour être honnête, je n'avais encore jamais mis le nez dans ces deux pages "App". C'est donc une génération automatique, non retouchée.

    Merci,
    Faguoren

  6. #6
    Invité
    Invité(e)
    Par défaut
    J'ai mis tout le code que tu m'as donné et ça fonctionne parfaitement, notamment le cast en "MainWindow".

    Tu as dû réaffecter le "App.Current.MainWindow" à un moment donné dans le code dont je ne dispose pas encore, je ne vois pas d'autres explications possibles. Regardes bien dans tes traitements tels que "Closure" par exemple.

    Ou alors sinon si tu ne vois pas, il faudrait que tu montres tout le code behind des fenêtres "MainWindow" et "fenetre"...

  7. #7
    Candidat au Club
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Avril 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    J'ai mis tout le code que tu m'as donné et ça fonctionne parfaitement
    Bizarrement ça m'étonne à peine. Ca m'arrive souvent ce genre de chose, le truc qui fonctionne pour tout le monde, sauf pour moi

    Bon, avant de faire mon Caliméro, je vais tout reprendre. Copier le code que je t'ai fourni dans un nouvel espace projet et, si ça marche, ré-intégrer une à une mes méthodes pour voir celle qui provoque l'erreur.
    Si ça fonctionne ainsi, je passerai le sujet à "Résolu".

    Sinon, je reviendrai crier à l'aide !!

    Quoi qu'il en soit, merci beaucoup Philippe pour tes tests.

    Faguoren

  8. #8
    Candidat au Club
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Avril 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bon, j'ai tout rebâti dans un nouveau projet, ajoutant une par une mes méthodes. Et au final... ça marche !
    Je ne sais pas ce que j'ai fait dans le précédent projet, mais manifestement, je n'aurai pas dû !

    Merci encore Philippe. Grâce à toi, j'ai eu la confirmation que le code marchait et je n'ai plus à chercher.
    Sujet résolu!

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

Discussions similaires

  1. Accéder aux propriétés du Layout depuis Adapter
    Par piero53 dans le forum Composants graphiques
    Réponses: 3
    Dernier message: 26/06/2013, 10h39
  2. [Débutant] C# Comment accéder aux propriétés des contrôle sur un autre formulaire
    Par Claude_Azoulai dans le forum Visual Studio
    Réponses: 0
    Dernier message: 03/04/2013, 17h04
  3. Modification d'une liste déroulante depuis une autre fenètre ouvertre
    Par dirty_harry dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/06/2009, 14h38
  4. Impossible d'accéder aux propriétés de GPO d'une UO
    Par zohir dans le forum Windows Serveur
    Réponses: 0
    Dernier message: 14/05/2009, 17h17
  5. Accéder aux éléments XAML à partir d'une autre classe
    Par Keitboor dans le forum Silverlight
    Réponses: 4
    Dernier message: 24/02/2009, 14h02

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