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 :

Désactiver un bouton d'une page depuis une autre.


Sujet :

Windows Presentation Foundation

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut Désactiver un bouton d'une page depuis une autre.
    Bonjour à tous,

    Je fais mumuse avec wpf et je suis confronté à un problème que je n'avais pas sous winForm.

    J'ai une window "MainWindow" sur laquelle j'ai créé des boutons et qui contient également un Frame pour afficher des pages.

    En fonction du bouton cliqué, je fais apparait la page correspondante dans le frame.

    Par exemple j'ai un bouton appelé "Button_Setting" et lorsque je clique dessus, le lance la page "Page_Setting" dans le frame avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void Button_Setting_Click (object sender, RoutedEventArgs e)
            {
                Main.Content = new Page_Setting();
            }
    Je ne sais pas si c'est la bonne procédure mais cela fonctionne.

    Par contre sur cette page "Page_Setting", j'ai un bouton "Button_Lock" et quand je clique dessus je souhaiterai désactiver tous les boutons de "MainWindow".

    Mais je n'arrive pas a accéder à la propriété "IsEnable" des Boutons de "MainWindow" depuis le code de ma "Page_Setting".... pourquoi?

    Comment dois-je m'y prendre pour interagir avec des éléments extérieurs à la page courante?

    Merci pour vos lumières

  2. #2
    Membre régulier Avatar de _champy_
    Homme Profil pro
    Chef de projet progiciel patrimoine route/tram/aeroport
    Inscrit en
    Novembre 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet progiciel patrimoine route/tram/aeroport
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2017
    Messages : 26
    Points : 75
    Points
    75
    Par défaut
    Tu tente de reproduire ce que tu fait en Winform en WPF, c'est faisable mais ce n'est pas vraiment la bonne solution.

    Tu peut t'en sortir en utilisant VisualTreeHelper, notamment la méthode GetParent et remonté récursivement la hiérarchie de composant jusqu’à rencontré une objet de type MainWindow.

    Ou encore plus crade conserver une référence static a MainWindow (dans un singleton ou une classe static) de façon à pouvoir y accéder partout.

    Je te conseil de lire la documentation sur le Binding , le MVVM, les ViewModel et l'interface INotifyPropertyChanged.

    Un fois ces concepts assimilés tu auras en gros deux choix :
    - Instancié tous les contrôles (tes pages) dans ta MainWindow et joué sur leur visibilité (mais il serons tous instancié au démarrage).
    - Utilisé un FrameWork qui gère des régions (Prism par exemple, la il serons Lazy instanciés).

    WPF c'est pas évident quand tu viens de Winform mais le faible couplage entre interface graphique et logique métier apporte des avantages insoupçonné pour un développeur qui viens de Winform.

  3. #3
    Membre régulier Avatar de _champy_
    Homme Profil pro
    Chef de projet progiciel patrimoine route/tram/aeroport
    Inscrit en
    Novembre 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet progiciel patrimoine route/tram/aeroport
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2017
    Messages : 26
    Points : 75
    Points
    75
    Par défaut
    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
     
    private T FindParent<T>(DependencyObject child)
     
    where T : DependencyObject
     
    {
     
    T parent = VisualTreeHelper.GetParent(child) as T;
     
    if (parent != null)
     
    return parent;
     
    else
     
    return FindParent<T>(parent);
     
    }
    Dans ton code Behind de ta page tu fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MainWindow mainWindow = this.FindParent<MainWindow>(this);
    Et tu auras une référence à MainWindow

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    Salut Champy,

    merci pour ton aide.

    Oui je suis parti sur WPF justement pour cette "independance" interface et logique metier mais je ne pensais pas que ce serait si différent.

    Pour mes essais, je suis parti sur une frame et des pages et j'ai également testé les usercontrol dans un tabcontrol mais à chaque fois je n'arrive pas à interagir avec les contrôles qui ne sont pas du même niveau hierachique, et ceux même en utilisant le "x:Name" dans le XAML.

    Je vais regarder ce que tu m'as fourni comme exemple mais je cherche à faire le plus simple possible (pas forcement le moins crade... vue mon faible niveau programmation je cherche avant tout à ce que cela fonctionne lol).


    Dans ton exemple tu parles de "conserver une référence static a MainWindow (dans un singleton ou une classe static) de façon à pouvoir y accéder partout.". Pourrais-tu me donner un exemple car je n'ai pas bien saisie.

    ps: pour info je suis parti sur un tabcontrol + des usercontrol qui contiendrons mes différents controls (combobox, txtbox ect...) et j'ai laissé tomber la frame + page.

  5. #5
    Membre régulier Avatar de _champy_
    Homme Profil pro
    Chef de projet progiciel patrimoine route/tram/aeroport
    Inscrit en
    Novembre 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet progiciel patrimoine route/tram/aeroport
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2017
    Messages : 26
    Points : 75
    Points
    75
    Par défaut
    En fait il y as déja un référence à la main window créer par le FrameWork elle est ici :
    Application.Current.MainWindow

    Dans l'absolue tu pourrais avoir un autre instance (ou même plusieurs) de cette classe autre part dans l'application mais la propriété Application.Current.MainWindow pointeras toujours vers la l'instance de la fenêtre d'entrée du programme.

Discussions similaires

  1. Réponses: 13
    Dernier message: 16/01/2015, 10h50
  2. Réponses: 6
    Dernier message: 16/12/2008, 16h31
  3. Réponses: 4
    Dernier message: 18/10/2008, 02h52
  4. Récupérer une date depuis une page ASP dans une BDD
    Par franckrichard57 dans le forum ASP
    Réponses: 2
    Dernier message: 22/03/2007, 11h31
  5. Charger une midlet depuis une page web
    Par sprouden dans le forum Java ME
    Réponses: 2
    Dernier message: 26/10/2006, 09h57

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