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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

+ 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