Monday, April 21, 2008

TabControl Rendering in WPF

Ich möchte in diesem Beitrag einige - für mich - unklaren Punkte über TabControl Behaviour in WPF unter die Lupe nehmen.

Ganz einfach, ich erzeuge zwei nested TabControl Elemente jeweils zwei Registerkarten
Entsprechende XAML Code sieht wie folgt aus:

<TabControl x:Name="tb1" SelectionChanged="tb1_SelectionChanged">
<TabItem Header="tab01">
</TabItem>
<TabItem Header="tab02">
<TabControl x:Name="subtb2">
<TabItem Header="SubTab01">
</TabItem>
<TabItem Header="SubTab02">
</TabItem>
</TabControl>
</TabItem>
</TabControl>


Dazu habe ich auch passende Codebehind geschrieben:

public void tb1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal
, new ShowMessage(ShowTabIndex), tb1.SelectedIndex.ToString());
}

public delegate void ShowMessage(string text);

private void ShowTabIndex(string text)
{
MessageBox.Show(text);
}



Jetzt, wenn ich den Reiter wechsele und auf Tab02 drücke, erscheint der MessageBox.
Aber beim Klicken des Subreiters auf Tab02 wird das Ereignis vom oberen Reiter SelectionChanged event getriggered. Ich habe für die untere TabControl auch ein Ereignis definiert und im Codebehind implementiert (gleiche wie tab01):

<TabControl x:Name="subtb2" SelectionChanged="subtb2_SelectionChanged">


Aber es scheint immer noch das gleiche zu sein, dass immer das Ereignis von parent TabControl mitgetriggered wird. Das finde ich ein bisschen verwirrend und unpraktisch.

Stay tuned

OnBir

No comments: