Bonjour
je souhaite créer un Tabcontrol avec plusieurs onglets. Au départ il n'y a qu'un seul onglet et en cliquant sur "+" on copie l'onglet existant. Jusque là ça va :
code xaml :
Code c# :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <TabControl Name="tabDynamic" ItemsSource="{Binding}" SelectionChanged="tabDynamic_SelectionChanged" Margin="0,10,0,0"> <TabControl.Resources> <DataTemplate x:Key="TabHeader" DataType="TabItem"> <DockPanel> <Button Name="btnDelete" DockPanel.Dock="Right" Margin="5,0,0,0" Padding="0" Click="btnDelete_Click" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}},Path=Name}"> </Button> <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}},Path=Header}"/> </DockPanel> </DataTemplate> </TabControl.Resources> </TabControl>
Source du code : http://www.codeproject.com/Articles/...mically-in-WPF
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93 private List<TabItem> _tabItems; private TabItem _tabAdd; public MainWindow() { try { InitializeComponent(); _tabItems = new List<TabItem>(); TabItem tabAdd = new TabItem(); tabAdd.Header = "+"; _tabItems.Add(tabAdd); this.AddTabItem(); tabDynamic.DataContext = _tabItems; tabDynamic.SelectedIndex = 0; } catch (Exception ex) { MessageBox.Show(ex.Message); } } private TabItem AddTabItem() { int count = _tabItems.Count; TabItem tab = new TabItem(); tab.Header = string.Format("Tab {0}", count); tab.Name = string.Format("Tab{0}", count); tab.HeaderTemplate = tabDynamic.FindResource("TabHeader") as DataTemplate; TextBox txt = new TextBox(); txt.Name = "txt"; tab.Content = txt; _tabItems.Insert(count - 1, tab); return tab; } private void tabDynamic_SelectionChanged(object sender, SelectionChangedEventArgs e) { TabItem tab = tabDynamic.SelectedItem as TabItem; if (tab != null && tab.Header != null) { if (tab.Header.Equals("+")) { tabDynamic.DataContext = null; TabItem newTab = this.AddTabItem(); tabDynamic.DataContext = _tabItems; tabDynamic.SelectedItem = newTab; } else { } } } private void btnDelete_Click(object sender, RoutedEventArgs e) { string tabName = (sender as Button).CommandParameter.ToString(); var item = tabDynamic.Items.Cast<TabItem>().Where(i => i.Name.Equals(tabName)).SingleOrDefault(); TabItem tab = item as TabItem; if (tab != null) { if (_tabItems.Count<3) { MessageBox.Show("cannot remove last tab"); } else if (MessageBox.Show(string.Format("Are you sure you want to remove the tab '{0}'?", tab.Header.ToString()),"remove Tab",MessageBoxButton.YesNo) == MessageBoxResult.Yes) { TabItem selectedTab = tabDynamic.SelectedItem as TabItem; tabDynamic.DataContext = null; _tabItems.Remove(tab); tabDynamic.DataContext = _tabItems; if (selectedTab == null || selectedTab.Equals(tab)) { selectedTab = _tabItems[0]; } tabDynamic.SelectedItem = selectedTab; } } }
Maintenant je souhaite que le contenu du premier TabItem (checkbox pour l'exemple) soit également copié, pour cela je rajoute un DataTemplate :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 <DataTemplate x:Key="TabHeader" DataType="TabItem"> <DockPanel> <Button Name="btnDelete" DockPanel.Dock="Right" Margin="5,0,0,0" Padding="0" Click="btnDelete_Click" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}},Path=Name}"> </Button> <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}},Path=Header}"/> </DockPanel> </DataTemplate> <DataTemplate x:Key="TabContent" DataType="TabItem"> <DockPanel> <CheckBox Name="chk"></CheckBox> </DockPanel> </DataTemplate>Ca marche aussi ! mais toutes mes checkbox ont le même nom, ce qui fait que lorsque je check celle dans le itemTab1, la checkbox du itemtab2 est également cochée... Je souhaite incrémenter le nom de mes checkbox au moment de la copie pour qu'elles soient uniques.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 ... TabItem tab = new TabItem(); tab.Header = string.Format("Tab {0}", count); tab.Name = string.Format("Tab{0}", count); tab.HeaderTemplate = tabDynamic.FindResource("TabHeader") as DataTemplate; tab.ContentTemplate = tabDynamic.FindResource("TabContent") as DataTemplate; TextBox txt = new TextBox(); txt.Name = "txt"; tab.Content = txt; ...
Comment faire ?
Merci d'avance pour votre aide.![]()
Partager