J'essaie de développer un écran de maintenance système pour ma demande dans laquelle j'ai plusieurs onglets représentant chacun une option de maintenance différente, c'est-à-dire des utilisateurs du système et de cetera. Une fois qu'un utilisateur clique sur Edition / Nouveau pour modifier un enregistrement existant, je souhaite empêcher de naviguer dans l'onglet Courant jusqu'à ce que l'utilisateur clique sur l'enregistrement ou l'annulation.
Après que certains googling, j'ai trouvé un lien http://joshsmithonwpf.wordpress.com/2009/09/04/Cow -à-prévenir-a-tabitem - de-être sélectionné / qui semblait résoudre mon problème, ou j'ai donc pensé. P>
J'ai essayé de la mettre en œuvre, mais mon événement ne semble jamais tirer. Ci-dessous est mon xaml. P> et ceci est mon code p> excuses maintenant si je suis stupide, mais Pour la vie de moi, je ne peux pas m'entraîner voir pourquoi mon événement ne se déclenche pas lorsque l'utilisateur clique sur des onglets entre les onglets. P> Merci pour toute votre aide. P> EMLYN P> P >
6 Réponses :
Josh utilise onglet.itemsSource code>. Vous utilisez onglet.items.sourcecollection code>. Cela pourrait être le problème. P>
Merci pour cette suggestion, mais comme mes onglets sont "codés durs" dans le XAML et non créés par une collection, cela ne semble pas fonctionner pour moi.
J'ai monté une solution qui convient à mes besoins. Semble légèrement à l'envers mais comparé aux autres options que j'ai trouvées, il semble sympa et soigné.
Fondamentalement, je garde une variable privée de Tabindex actuel et sur Selectionchanged code> événement du Tabcontrol Code>, je fais des chèques et définissez le tabcontrol.selectedex code> à cette valeur si l'utilisateur n'est pas en mode de navigation. P> private void tabControl_SelectionChanged(object sender,
System.Windows.Controls.SelectionChangedEventArgs e)
{
if (e.OriginalSource == tabControl)
{
if (EditMode == TEditMode.emBrowse)
{
_TabItemIndex = tabControl.SelectedIndex;
}
else if (tabControl.SelectedIndex != _TabItemIndex)
{
e.Handled = true;
tabControl.SelectedIndex = _TabItemIndex;
MessageBox.Show("Please Save or Cancel your work first.", "Error",
MessageBoxButton.OK, MessageBoxImage.Error);
}
}
}
Je me luttais aussi avec ça aussi. Je viens de le faire fonctionner simplement en ajoutant simplement le paramètre sur le tabcontrol. Travaillé comme un charme après cela. P> p>
Excellent ... nous nous débattions avec le même problème ici et cela m'occupait de cela. Merci!
ou implémentez-le vous-même ...
public delegate void PreviewSelectionChangedEventHandler(object p_oSender, PreviewSelectionChangedEventArgs p_eEventArgs);
public class PreviewSelectionChangedEventArgs
{
internal PreviewSelectionChangedEventArgs(IList p_lAddedItems, IList p_lRemovedItems)
{
this.AddedItems = p_lAddedItems;
this.RemovedItems = p_lRemovedItems;
}
public bool Cancel { get; set; }
public IList AddedItems { get; private set; }
public IList RemovedItems { get; private set; }
}
public class TabControl2: TabControl
{
public event PreviewSelectionChangedEventHandler PreviewSelectionChanged;
private int? m_lLastSelectedIndex;
protected override void OnSelectionChanged(SelectionChangedEventArgs e)
{
base.OnSelectionChanged(e);
// déterminer si on doit annuler la sélection
PreviewSelectionChangedEventArgs eEventArgs = new PreviewSelectionChangedEventArgs(e.AddedItems, e.RemovedItems);
if (m_lLastSelectedIndex.HasValue)
if (PreviewSelectionChanged != null)
PreviewSelectionChanged(this, eEventArgs);
// annuler (ou pas) la sélection
if (eEventArgs.Cancel)
this.SelectedIndex = m_lLastSelectedIndex.Value;
else
m_lLastSelectedIndex = this.SelectedIndex;
}
}
J'utilise cette technique et cela semble bien fonctionner. Étant donné que je voulais dire à l'utilisateur pourquoi ils ne peuvent pas modifier les onglets, j'ai ajouté ceci au gestionnaire d'aperçuSelectionChanged: si (dontavetabchange) {eventargs.cancel = true; Dispatcher.begininvoke (nouvelle action (((() => {MessageBox.show ("Veuillez enregistrer les modifications avant de quitter cet onglet.", "AVERTISSEMENT", MESSAGEBOXBUTONTON.OK, MESSAGEBOXIMAGE.OOCLAMATION);}); } code>
Selon ce message
Ceci a fonctionné pour moi: p>
Je commence à saisir xaml donc j'espère que je n'ai pas manqué votre point. J'ai eu le même problème et pour moi cela a fonctionné mieux.
dans xaml, je définis un style qui bascule l'état réadonnement p> dans la vue, j'ai une propriété p> espère que cela aide. p> p>
La méthode de Josh ne fonctionne pas non plus pour moi.