none
[TabControl] TabItem invisible RRS feed

  • Question

  • Bonjour à tous, je suis un peu nouveau en WPF et j'essaie de faire une application avec de onglets dans le style de IE7 (possibilté d'ajout d'onglet, scroll quand il y en a trop, etc). J'ai donc créer un Custom User Control héritant de TabControl dont voici la définition

    [TemplatePart(Name = "PART_DropDown", Type = typeof(ToggleButton))]
        [TemplatePart(Name = "PART_NewTabButton", Type = typeof(ButtonBase))]
        public class Desktops: TabControl
        {
            #region Fields
    
            private ToggleButton _toggleButton;
            private ButtonBase _addNewButton;
    
            #endregion
    
            #region Constructor
    
            static Desktops()
            {
                DefaultStyleKeyProperty.OverrideMetadata(typeof(Desktops), new FrameworkPropertyMetadata(typeof(Desktops)));
            }
    
            public Desktops()
            {
                this.TabStripPlacement = Dock.Bottom;
    
                this.AddHandler(Desktop.CloseTabEvent, new RoutedEventHandler(this.CloseTab));
    
                if (this.Template == null)
                    return;
    
                ButtonBase button = this.Template.FindName("PART_NewTabButton", this) as ButtonBase;
                if (button == null) return;
    
                button.Visibility = Visibility.Visible;
            }
    
            #endregion
    
    
            #region Overrides
    
            public override void OnApplyTemplate()
            {
                base.OnApplyTemplate();
    
                #region Toggle Button
    
                _toggleButton = this.Template.FindName("PART_DropDown", this) as ToggleButton;
                if (_toggleButton != null)
                {
                    // create a context menu for the togglebutton
                    ContextMenu cm = new ContextMenu { PlacementTarget = _toggleButton, Placement = PlacementMode.Bottom };
    
                    _toggleButton.ContextMenu = cm;
                    _toggleButton.Checked += DropdownButton_Checked;
                }
                #endregion
    
                #region Add Button
    
                _addNewButton = this.Template.FindName("PART_NewTabButton", this) as ButtonBase;
                if (_addNewButton != null)
                    _addNewButton.Click += ((sender, routedEventArgs) => AddTabItem());
                
                #endregion
            }
    
    
            protected override bool IsItemItsOwnContainerOverride(object item)
            {
                return item is Desktop;
            }
            
    
            protected override DependencyObject GetContainerForItemOverride()
            {
                return new Desktop();
            }
    
            #endregion
    
    
            #region Events
    
            private void CloseTab(object source, RoutedEventArgs args)
            {
                Desktop tabItem = args.Source as Desktop;
                if (tabItem != null)
                {
                    TabControl tabControl = tabItem.Parent as TabControl;
                    if (tabControl != null)
                    {
                        if (tabControl.Items.Count > 1)
                            tabControl.Items.Remove(tabItem);
                    }
                }
            }
    
            public void AddTabItem()
            {
                Desktop item = new Desktop { Header = "yes"};
    
                this.Items.Add(item);
    
                string tex = "";
                foreach (TabItem it in this.Items)
                    tex += (string)it.Header + "\n";
                MessageBox.Show(tex);
    
            }
    
            void DropdownButton_Checked(object sender, RoutedEventArgs e)
            {
                if (_toggleButton == null) return;
    
                _toggleButton.ContextMenu.Items.Clear();
    
            }
    
            #endregion
     Et voici le template que j'ai mis dans le fichier Generic.xaml

        <Style x:Key="{x:Type local:Desktops}" TargetType="{x:Type local:Desktops}"
               BasedOn="{StaticResource {x:Type TabControl}}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Grid SnapsToDevicePixels="{Binding Path=SnapsToDevicePixels, RelativeSource={RelativeSource TemplatedParent}}" KeyboardNavigation.TabNavigation="Local">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="*" />
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition x:Name="RowDefinition0" Height="*" />
                                <RowDefinition x:Name="RowDefinition1" Height="Auto" />
                            </Grid.RowDefinitions>
    
                            
                            <ToggleButton 
                                x:Name="PART_DropDown" 
                                Grid.Row="1"
                                Height="22"
                                Width="16"
                                VerticalAlignment="Top"
                                Margin="0,-1,0,0"
                                Grid.Column="0" 
                                Style="{StaticResource DropDownToggleButtonStyle}" 
                                ToolTip="Display all the tabs in a menu"/>
    
                            <Button 
                                x:Name="PART_NewTabButton" 
                                Grid.Row="1"
                                Grid.Column="1" 
                                Height="22"
                                VerticalAlignment="Top"
                                Margin="-1,-1,0,0" 
                                Style="{StaticResource NewTabButtonStyle}" 
                                Width="24"
    				            ToolTip="Add a New tab"
                                Content="Add"
                                />
                            </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

    Le problème est qu'avec ce template, je ne vois pas mes TabItem, que ce soit quand je les crée avec le bouton d'ajout ou que je les mettent directement dans le XAML. Le truc c'est qu'ils sont bien dans la collection Items de mon TabConrol (quand j'ajoute un TabItem avec le bouton d'ajout, j'affiche la liste des Header).

    Aurais-je oublié quelque chose?

    Merci de votre aide
    jeudi 2 avril 2009 07:53

Réponses