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 :

Interface multi-document


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut Interface multi-document
    Salut,

    Je suis en train de développer une appli WPF qui permet d'ouvrir plusieurs documents (type MDI) dans un TabControl.

    J'ai repris l'architecture que j'avais déjà utilisé une fois, à savoir :
    - une liste de mes objets métier (Documents) dans une ObservableCollection dans ma classe App
    - un UserControl qui affiche un Document
    - un TabControl bindé sur la liste des documents, avec des templates pour afficher les documents :
    Code XML : 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
     
        <Window.Resources>
     
            <DataTemplate x:Key="tplDocumentTabContent">
                <my:DocumentControl Document="{Binding SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType=TabControl}}"/>
            </DataTemplate>
     
            <DataTemplate x:Key="tplDocumentTabHeader" DataType="{x:Type model:Document}">
                <Border>
                    <TextBlock Text="{Binding DisplayName}"/>
                    <Border.InputBindings>
                        <MouseBinding MouseAction="MiddleClick" Command="Close"/>
                    </Border.InputBindings>
                </Border>
            </DataTemplate>
     
        </Window.Resources>
     
     
    ...
     
        <TabControl Name="tabDocuments"
                    ItemTemplate="{StaticResource tplDocumentTabHeader}"
                    ContentTemplate="{StaticResource tplDocumentTabContent}"
                    ItemsSource="{Binding Documents, Source={x:Static Application.Current}}"
                    SelectedItem="{Binding ActiveDocument, Source={x:Static Application.Current}}" />

    Ce qui me pose problème, c'est que pour le contenu, ça ne crée pas systématiquement une nouvelle instance de mon UserControl pour chaque nouveau document, en général ça réutilise la même... et ce n'est pas du tout ce que je veux, parce que l'éditeur proprement dit est un ICSharpCode.TextEditor (inclus via un WindowsFormsHost) qui maintient son propre état, différent pour chaque document. J'ai donc besoin d'avoir une instance différente de mon UserControl pour chaque document.

    La dernière fois que j'avais utilisé ce système, mon UserControl était entièrement bindé à l'objet métier, et tout se passait sans problème : les bindings étaient simplement mis à jour au changement de document, et je n'y voyais que du feu, je n'avais pas réalisé que c'était la même instance du UserControl qui était utilisée... Sauf que cette fois-ci c'est gênant

    Est-ce que quelqu'un aurait une solution à ce problème ? Ou est-ce que je m'y suis mal pris dans la définition des templates pour le TabControl ? (Pour le ContentTemplate ça me semble un peu bancal...)

    Ou alors y a-t-il une technique complètement différente que je pourrais utiliser pour réaliser cette interface ?

  2. #2
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Par défaut
    Pourquoi ne pas utiliser une autre classe dédié à la "vue" d'un document.

    Un document serait associé à une instance d'une classe View. Cette classe View encapsulerait ton composant TextEditor.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    class View
       Document Document {get;set}
       FrameworkElement Editor {get;}
    Tu auras donc une vue par document avec une instance de TextEditor dédiée.
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Tiens, j'avais abandonné tout espoir de réponse pour cette question là

    Pas bête comme méthode, j'avais pas pensé... c'est le modèle MVVM non ?

    Sinon, en attendant j'avais trouvé une solution, mais c'était plus ou moins bancal...
    En gros, j'ai remplacé mon TabControl par un contrôle custom hérité de Selector. Son template contient 2 ListBox :
    - 1 pour les onglets, templaté de façon à ressembler à une barre d'onglets
    - 1 pour le contenu, avec un ItemContainerStyle tel que seul l'élément sélectionné est visible
    Les ItemsSource et SelectedItem des 2 listes sont bindés sur le TemplatedControl

    Donc en gros, c'est comme un TabControl, sauf que j'ai bien un DocumentControl par document (même si un seul est visible), au lieu d'un seul qui est réutilisé pour chaque document.

    Mais bon c'est un peu du bricolage... ta méthode a l'air plus propre, je vais l'essayer

    Merci !

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

Discussions similaires

  1. Création interface multi-panel
    Par miniil dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 24/02/2009, 07h53
  2. Publipostage multi-documents possible ?
    Par Carambar dans le forum VBA Word
    Réponses: 2
    Dernier message: 21/11/2008, 14h35
  3. Interface multi utilisateurs
    Par Lorenzole+bo dans le forum Access
    Réponses: 1
    Dernier message: 03/09/2008, 06h48
  4. Réponses: 1
    Dernier message: 13/03/2007, 20h55
  5. interface : multi surface et objet
    Par DEVfan dans le forum SDL
    Réponses: 1
    Dernier message: 31/07/2006, 22h33

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