11
votes

Le contrôle de l'onglet WPF empêche la modification de l'onglet

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é.

J'ai essayé de la mettre en œuvre, mais mon événement ne semble jamais tirer. Ci-dessous est mon xaml. xxx

et ceci est mon code xxx

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.

Merci pour toute votre aide.

EMLYN


1 commentaires

La méthode de Josh ne fonctionne pas non plus pour moi.


6 Réponses :


0
votes

Josh utilise onglet.itemsSource . Vous utilisez onglet.items.sourcecollection . Cela pourrait être le problème.


1 commentaires

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.



15
votes

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);
        }
    }
}


0 commentaires

9
votes

Je me luttais aussi avec ça aussi. Je viens de le faire fonctionner simplement en ajoutant simplement le paramètre xxx

sur le tabcontrol. Travaillé comme un charme après cela.


1 commentaires

Excellent ... nous nous débattions avec le même problème ici et cela m'occupait de cela. Merci!



0
votes

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;
    }
}


1 commentaires

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);}); }




0
votes

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 xxx

dans la vue, j'ai une propriété xxx

espère que cela aide.


0 commentaires