Problema
Ho un controllo scheda personalizzata utilizzando le schede a forma di Chrome che si lega ad un ViewModel. A causa della forma, i bordi si sovrappongono un po '. Ho una funzione che imposta lo ZIndex di tabItem su TabControl_SelectionChanged
che funziona bene per la selezione delle schede e il trascinamento/rilascio delle schede, tuttavia quando aggiungo o chiudi una scheda tramite un comando di inoltro ottengo risultati insoliti. Qualcuno ha qualche idea? guardaWPF - sovrapposte personalizzati schede in un TabControl e ZIndex
predefinita:
Rimozione schede:
aggiungendo 2 o più schede consecutive:
L'aggiunta di più di 1 scheda alla volta non reimposta lo zindex di altre schede aggiunte di recente, in modo che vadano dietro la scheda a destra, e le schede di chiusura non rendono correttamente lo ZIndex del SelectedTab che lo sostituisce e viene visualizzato dietro il scheda alla sua destra.
codice per impostare ZIndex
private void PrimaryTabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.Source is TabControl)
{
TabControl tabControl = sender as TabControl;
ItemContainerGenerator icg = tabControl.ItemContainerGenerator;
if (icg.Status == System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated)
{
foreach (object o in tabControl.Items)
{
UIElement tabItem = icg.ContainerFromItem(o) as UIElement;
Panel.SetZIndex(tabItem, (o == tabControl.SelectedItem ? 100 :
90 - tabControl.Items.IndexOf(o)));
}
}
}
}
Utilizzando i punti di interruzione che posso vedere che sia correttamente l'impostazione del ZIndex a quello che io voglio che, tuttavia il layout è che non visualizza le modifiche. So che alcune modifiche sono effettive perché se nessuna di esse funzionasse, i bordi delle schede verrebbero invertiti (le schede corrette verrebbero disegnate sopra quelle a sinistra). Facendo clic su una scheda si imposta correttamente la zindice di tutte le schede (inclusa quella che dovrebbe essere disegnata in alto) e trascinandole/rilasciandole per riorganizzarle si esegue anche il rendering corretto (che rimuove e reinserisce l'elemento della scheda). L'unica differenza che posso pensare è che sto usando il modello di progettazione MVVM ei pulsanti che le schede Aggiungi/Chiudi sono comandi di inoltro.
Qualcuno ha qualche idea del perché questo sta accadendo e come posso risolvere il problema ??
p.s. Ho provato a impostare uno ZIndex nel mio ViewModel e ad associarlo, tuttavia la stessa cosa accade quando aggiungo/rimuovi le schede tramite il comando relay.
Ora sto pensando che sia un problema con WPF e non il mio codice. Ho aggiunto un pulsante che visualizza zIndex degli elementi della scheda dopo che sono stati disegnati e zIndex è sicuramente corretto su tutti loro, non vengono disegnati correttamente. – Rachel
Ciao. Dare tabs in un TabControl la forma trapezoidale simile a Chrome e far sì che si comportino correttamente sembra essere piuttosto complicato in WPF. Qualche possibilità di condividere lo XAML che hai usato per il template/styling? Ho una soluzione qui, ma non è particolarmente elegante - curioso di quello che hai fatto! Saluti. – Noldorin
Certo, il codice è un po 'troppo lungo per postare qui, ma proverò a spiegarlo. In caso di domande, non esitate a scrivermi a [email protected] Ogni Tab è in realtà una Griglia con 3 celle: quelle Sinistra e Destra contengono un Percorso che disegna la curva e quello centrale contiene i dati. Ciascuna griglia ha un margine negativo impostato per farli sovrapporre e zIndex viene usato per impostare quale deve essere in cima. Non sono sicuro se stai aggiungendo il trascinamento/rilascio o lo scorrimento, ma nel mio caso tutte le schede sono contenute in un ScrollViewer per lo scorrimento e DragDrop è una proprietà associata a ItemsControl di TabControl. – Rachel