Bonjour,
J'ai récupérer quelque part (je ne sais plus ou) un code qui me permet d'avoir une petite croix dans chaque tabitem d'un tabcontrol. En cliquant sur la croix, le tabitem se ferme. Jusque là tout fonctionne bien et je ne me suis pas vraiment préoccupé de comprendre à fond le fonctionnement qui me suffisait jusqu'à maintenant.
Cependant, j'aimerais avoir en plus un tabcontrol à l'intérieur d'un tabitem. mais mon code de fermeture ne fonctionne plus sur les tabitem "enfants".
TabControl
TabItem (se ferme normalement)
TabItem (se ferme normalement)
TabItem (ne se ferme pas)
TabItem (ne se ferme pas)
Ma classe
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
|
public class CloseableTab : TabItem, IDisposable
{
public static readonly RoutedEvent CloseTabEvent =
EventManager.RegisterRoutedEvent("CloseTab", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(CloseableTab));
static CloseableTab()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CloseableTab), new FrameworkPropertyMetadata(typeof(CloseableTab)));
}
public event RoutedEventHandler CloseTab
{
add { AddHandler(CloseTabEvent, value); }
remove { RemoveHandler(CloseTabEvent, value); }
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
Button closeButton = base.GetTemplateChild("PART_Close") as Button;
if (closeButton != null)
closeButton.Click += new System.Windows.RoutedEventHandler(closeButton_Click);
}
void closeButton_Click(object sender, System.Windows.RoutedEventArgs e)
{
this.RaiseEvent(new RoutedEventArgs(CloseTabEvent, this));
}
public void Dispose()
{
throw new NotImplementedException();
}
} |
Dans la fenêtre ou je veux utiliser ces tabitem personnalisés, j'ajoute le code suivant :
1 2 3 4 5 6 7 8
|
public partial class MainWindow : Window
{
public MainWindow(String _login, SecureString _password) //CONSTRUCTOR
{
InitializeComponent();
this.AddHandler(CloseableTab.CloseTabEvent, new RoutedEventHandler(this.CloseTab));
} |
1 2 3 4 5 6 7 8 9 10 11
|
private void CloseTab(object source, RoutedEventArgs args)
{
TabItem tabItem = args.Source as TabItem;
if (tabItem != null)
{
TabControl tabControl = tabItem.Parent as TabControl;
if (tabControl != null)
tabControl.Items.Remove(tabItem);
}
} |
Je passe le code xaml qui ajoute graphiquement la croix.
En debug, le code passe bien par les bonnes fonction, mais le args.Source ne correspond pas à un CloseableTab dans le cas des tabitem enfants. mais au contrôle parent. (en l'occurence un user control)
Est-ce que quelqu'un pourrait m'indiquer une éventuelle solution ? (pas facile sur un bout de code à la volée comme ça
)
Merci d'avance.
Partager