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 :

Gestion de l'ajout de content dans un TabItem


Sujet :

Windows Presentation Foundation

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 84
    Par défaut Gestion de l'ajout de content dans un TabItem
    Bonjour à tous,

    J'essaie (encore) de créer un bandeau de menu modulaire qui pourrait changer en fonction de l'application lancée. J'ai donc réussi à créer mon user control avec un TabControl et tout et tout, j'arrive à charger et à décharger un bandeau simple (j'entends par simple, un bandeau avec seulement un bouton )

    Voici le code de mon bandeau

    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
     
    <UserControl x:Class="SDK.Ribbon"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:SDK"
        Height="130" >
        <Grid>
    <Border DockPanel.Dock="Top" CornerRadius="4,4,4,4" BorderThickness="1" Margin="0,0,0,0">
                <local:MenuTabControl VerticalAlignment="Bottom" Margin="50,0,0,0" x:Name="tabControl">
                    <local:MenuTabItem Header="toto" />
                    <local:MenuTabItem Header="tota" />
                </local:MenuTabControl>
            </Border>
        </Grid>
    </UserControl>
    Le .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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    public partial class Ribbon : UserControl
        {
            public Ribbon()
            {
                InitializeComponent();
            }
     
            public void LoadRibbon(Uri uri)
            {
                XmlReader reader = XmlReader.Create(uri.ToString());
     
                MenuTabControl sd = (MenuTabControl) XamlReader.Load(reader);
     
                this.tabControl.LoadTabControl(sd);
            }
     
            public void LoadRibbon(string ribbon)
            {
                StringReader stringReader = new StringReader(ribbon);
                XmlReader xmlReader = XmlReader.Create(stringReader);
     
                MenuTabControl sd = (MenuTabControl)XamlReader.Load(xmlReader);
     
                this.tabControl.LoadTabControl(sd);
            }
     
            public void Clear()
            {
                tabControl.Clear();
            }
        }
    Maintenant le TabControl

    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
     
    public class MenuTabControl: TabControl
        {
            static MenuTabControl()
            {
                DefaultStyleKeyProperty.OverrideMetadata(typeof(MenuTabControl), new FrameworkPropertyMetadata(typeof(MenuTabControl)));
            }
     
            public MenuTabControl()
                : base()
            {
                this.Height = 120;
                this.TabStripPlacement = Dock.Top;
            }
     
    public void LoadTabControl(MenuTabControl tabContol)
            {
                this.Items.Clear();
     
                foreach (MenuTabItem item in tabContol.Items)
                {
                    tabContol.RemoveLogicalChild(item);
                    this.Items.Add(item);
                }
            }
     
            public void Clear()
            {
                Items.Clear();
            }
        }
    Et les tabItem

    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
     
    public class MenuTabItem : TabItem
        {
            StackPanel _panel;
     
            static MenuTabItem()
            {
                DefaultStyleKeyProperty.OverrideMetadata(typeof(MenuTabItem), new FrameworkPropertyMetadata(typeof(MenuTabItem)));
            }
     
            public MenuTabItem()
            {
                _panel = new StackPanel();
                _panel.Orientation = Orientation.Horizontal;
            }
     
            protected override void OnContentChanged(object oldContent, object newContent)
            {
                Console.WriteLine("-----------------");
                Console.WriteLine(newContent.ToString());
                _panel.Children.Add((UIElement) newContent);
     
                //base.OnContentChanged(oldContent, newContent);
            }
        }
    ça marchait, jusqu'à l'ajout de l'override sur OnContentChanged. En fait, je voudrais qu'à l'ajout d'un item dans le xaml, l'item s'ajoute dans le StackPanel.

    Quand j'execute mon programme, ça donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Must disconnect specified child from current parent Visual before attaching to new parent Visual.
    Auriez vous une idée sur comment faire pour règler ça?

    Merci

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    met ton projet ou une version alegé en link et ca sera plus simple stp

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 84
    Par défaut
    Voici une version compressé de mon projet, c'est un SDK. Tu retrouvera les mêmes classes que j'ai cité avec leur nom précédé de "Simply".

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    met un projet d'exemple dedans avec ton probleme !! que je puisse regarder

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 84
    Par défaut
    J'ai apporté une modification qui fait que ça marche un peu mieux mais pas complètement .

    Donc ma classe TabItem s'écrit comme ceci

    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
     
    [ContentProperty("Contents")]
        public class MenuTabItem : TabItem
        {
            StackPanel _panel;
            private List<UIElement> _contents;
     
            public List<UIElement> Contents
            {
                get
                {
                    if (null == _contents)
                        _contents = new List<UIElement>();
     
                    return _contents;
                }
            }
     
            public StackPanel Pane
            {
                get { return _panel; }
            }
     
            static MenuTabItem()
            {
                DefaultStyleKeyProperty.OverrideMetadata(typeof(MenuTabItem), new FrameworkPropertyMetadata(typeof(MenuTabItem)));
            }
     
            public MenuTabItem()
            {
                _panel = new StackPanel();
                _panel.Orientation = Orientation.Horizontal;
            }
     
            public override void OnApplyTemplate()
            {
                foreach (UIElement el in Contents)
                    _panel.Children.Add(el);
     
                base.OnApplyTemplate();
            }
        }
    Maintenant, le chargement du XAML marche . Le problème est que je ne vois pas mes éléments alors qu'ils y sont. J'ai vérifié avec la console que les éléments que j'avais dans mon XAML sont bien dans la propriété Children de mon StackPanel.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    j'ai pas vraiment pu tester (vu que j'ai pas de projet de test effectif) mais pour info comme j'ai déjà refait un tabcontrol complet je vais te filer le code

    je sais pas si ca va t'aider mais c'est a priori comme ca qu'on derrive
    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
     
        //---------------------------------------------------------------------------
        #region TabControlLeveled
        //---------------------------------------------------------------------------
        public class TabControlLeveled : TabControl
        {
            public TabControlLeveled() 
                : base()
            {
            }
            protected override DependencyObject GetContainerForItemOverride()
            {
                return new TabItemLeveled();
            }
            protected override bool IsItemItsOwnContainerOverride(object item)
            {
                return item is TabItemLeveled;
            }
        }
        //---------------------------------------------------------------------------
        #endregion
        //---------------------------------------------------------------------------
        #region TabItemLeveled
        //---------------------------------------------------------------------------
        public class TabItemLeveled : TabItem
        {
            //---------------------------------------------------------------------------
            private LeveledController _LeveledController = new LeveledController();
            //---------------------------------------------------------------------------
            public TabItemLeveled()
                : base()
            {
                _LeveledController.Reset();
                this.AddHandler(BaseLeveledUserControl.LevelChangedEvent, new LevelChangedEventHandler(_LevelChanged));
                _LevelChanged(this, null);
            }
            //---------------------------------------------------------------------------
            private void _LevelChanged(object sender, LevelChangedEventArgs e)
            {
                if(e != null )  this._LeveledController.Set(e.LeveledTransition);
                this.Background = new LevelToColorConverter().Convert(this._LeveledController.Level, null, null, null) as System.Windows.Media.Brush;
                this.InvalidateVisual();
            }
            //---------------------------------------------------------------------------
        }
        //---------------------------------------------------------------------------
        #endregion
        //---------------------------------------------------------------------------
    tu oublira le levelcontrol qui me permet a moi d'enregistrer dans chaque tab les elements de level des sous éléments contenus

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 84
    Par défaut
    Alors, voici un projet exemple avec le SDK, dis moi si tu arrive à comprendre pourquoi mes éléments ne s'affichent pas tu me sauvera .

    Merci

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    bon voila les corrections que tu dois mettre dans SimplyRibbon.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
     
     <Border DockPanel.Dock="Top" CornerRadius="4,4,4,4" BorderThickness="1" Margin="0,0,0,0">
                <local:SimplyMenuTabControl VerticalAlignment="Bottom" Margin="50,0,0,0" x:Name="tabControl">
                    <local:SimplyMenuTabItem Header="toto">
                        <StackPanel Orientation="Vertical">
                            <Button Content="hella"></Button>
                            <Button Content="hello"></Button>
                        </StackPanel>
                    </local:SimplyMenuTabItem>
                    <local:SimplyMenuTabItem Header="tota">
                        <Button Content="hello"></Button>
                    </local:SimplyMenuTabItem>
                </local:SimplyMenuTabControl>
            </Border>
    et simplifier la classe SimplyMenuTabItem
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        public class SimplyMenuTabItem : TabItem
        {
            static SimplyMenuTabItem()
            {
                DefaultStyleKeyProperty.OverrideMetadata(typeof(SimplyMenuTabItem), new FrameworkPropertyMetadata(typeof(SimplyMenuTabItem)));
            }
     
            public SimplyMenuTabItem()
            {
            }
        }
    dans tous les cas y'avait un soucis si tu rajoute un stackpanel en programmation faut au moins le rajouter au content ou en faire un content container ...
    après tu pouvais simplifier comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            private List<UIElement> _contents = new List<UIElement>();
            public List<UIElement> Contents2 { get { return _contents; }}
            public StackPanel Pane {  get; }

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 84
    Par défaut
    Merci Ikeas, à faire des trucs compliqué, on en oublie les trucs simples .

    Sinon, je ne peux pas simplifier mon code comme tu me le conseilles, car le but de la librairie que tu as vu est de permettre à l'utilisateur de créer facilement une interface, sans énormément de ligne de code, un peu comme la bibliothèque fournit par Microsoft pour le Ribbon Office

    En tout cas, encore merci

  10. #10
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Citation Envoyé par Tod_sd Voir le message
    Sinon, je ne peux pas simplifier mon code comme tu me le conseilles, car le but de la librairie que tu as vu est de permettre à l'utilisateur de créer facilement une interface, sans énormément de ligne de code, un peu comme la bibliothèque fournit par Microsoft pour le Ribbon Office
    Je ne vois pas le rapport: ce n'est pas parce que tu as pour but de fournir un Framework qu'il faut que celui-ci soit développé de façon complexe/tiré par les cheveux...

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 84
    Par défaut
    C'est parce que c'est la demande de l'utilisateur

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/02/2015, 15h34
  2. [SP-2010] Ajouter un Content Editor dans une page applicative
    Par tomo0013 dans le forum SharePoint
    Réponses: 5
    Dernier message: 25/01/2011, 15h11
  3. [SP-2007] Ajouter un utilisateur dans un content Type
    Par stardeus dans le forum SharePoint
    Réponses: 4
    Dernier message: 03/12/2010, 16h04
  4. Ajout de content dans une balise xaml
    Par Tod_sd dans le forum Windows Presentation Foundation
    Réponses: 12
    Dernier message: 08/04/2009, 13h54
  5. Ajouter plusieurs Usercontrols dans un asp:Content
    Par teddyalbina dans le forum ASP.NET
    Réponses: 1
    Dernier message: 17/12/2008, 22h47

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