Ich resoliere schließlich, um eine einfache tabcontrol selbst zu implementieren, weil ich dann Kontrolle über alles habe.
<WrapPanel x:Name="WrapPanel_Main"> <!-- This is the TabControl -->
<Border x:Name="Border_Configuration" Margin="5,5,0,0" BorderThickness="4,4,4,0"> <!-- This is the first tab -->
<TextBlock x:Name="TextBlock_Configuration" Text="Configuration" Padding="5" MouseLeftButtonUp="TextBlock_Step_MouseLeftButtonUp"/>
</Border>
<Border Margin="5,5,0,0" BorderThickness="4,4,4,0"> <!-- This is the second tab -->
<TextBlock x:Name="TextBlock_Artists" Text="Artists" Padding="5" MouseLeftButtonUp="TextBlock_Step_MouseLeftButtonUp" />
</Border>
<Border Margin="5,5,0,0" BorderThickness="4,4,4,0"> <!-- This is the third tab -->
<TextBlock x:Name="TextBlock_ReleaseGroups" Text="Release Groups" Padding="5" MouseLeftButtonUp="TextBlock_Step_MouseLeftButtonUp"/>
</Border>
</WrapPanel>
<Border x:Name="Border_Placeholder" Grid.Row="1" Margin="5,0,5,5"> <!-- placeholder for the content of each tab -->
<ContentControl x:Name="ContentControl_Placeholder" Grid.Row="1" Padding="5" />
</Border>
Und hier die Behandlungsroutine, die Pflege der Maus-Up-Ereignis der "Tabs" nimmt. Ich habe eine Schnittstelle erstellt, jede Benutzersteuerung, die als Inhalt für die Registerkarte verwendet wird, muss implementiert werden. Auf diese Weise kann das Benutzersteuerelement die "Registerkartensteuerung" über nicht gespeicherte Änderungen informieren und entsprechende (vom Benutzer gewählte) Maßnahmen ergreifen. Danach lädt es den neuen Inhalt und ändert das Aussehen der "Tab-Header". Die Menge an mehr Code, die dies verursacht, ist meiner Meinung nach akzeptabel für die volle Kontrolle über Tab-Änderungen.
private void TextBlock_Step_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
ICancelUnloading currentElement = ContentControl_Placeholder.Content as ICancelUnloading;
if (currentElement != null)
{
if (currentElement.UnsavedChanges)
{
MessageBoxResult result = MessageBox.Show("Yes: Save, No: Discard, Cancel: Stay", "Unsaved Changes", MessageBoxButton.YesNoCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel);
if (result == MessageBoxResult.Cancel)
return;
if (result == MessageBoxResult.Yes)
currentElement.Save();
}
}
TextBlock textBlock = sender as TextBlock;
if (textBlock != null)
{
switch (textBlock.Name)
{
case "TextBlock_Configuration":
ContentControl_Placeholder.Content = new ConfigurationView();
break;
case "TextBlock_Artists":
ContentControl_Placeholder.Content = new ArtistsView();
break;
case "TextBlock_ReleaseGroups":
ContentControl_Placeholder.Content = new ReleaseGroupsView();
break;
}
ActivateTab(textBlock);
}
}
xmlns: intr = "clr-namespace: System.Windows.Interactivity; Montage = System.Windows.Interactivity" – leapold
interessante Möglichkeit. Ich bin mir nicht sicher, ob das mouseup-Ereignis ausreichen würde, um alle möglichen Arten des Änderns des Tabs abzudecken, und dann müsste ich noch verhindern, dass sich der Tab ändert ... – Aaginor