WPF Onglet Contrôle de Prévenir l'Onglet Modifier
Je suis en train de développer un système d'entretien de l'écran pour mon application dans laquelle j'ai plusieurs onglets, chacun représentant un entretien option c'est à dire de maintenir le système des utilisateurs et cetera. Une fois qu'un utilisateur clique sur modifier/nouvelle pour modifier un enregistrement existant je veux éviter de naviguer à l'extérieur de l'onglet en cours jusqu'à ce que l'utilisateur clique sur enregistrer ou sur annuler.
Après quelques recherches sur google j'ai trouvé un lien http://joshsmithonwpf.wordpress.com/2009/09/04/how-to-prevent-a-tabitem-from-being-selected/ qui semblait à résoudre mon problème, ou alors j'ai pensé.
J'ai essayé de mise en œuvre de cette, mais mon cas ne semble jamais à feu. Ci-dessous mon code XAML.
<TabControl Name="tabControl">
<TabItem Header="Users">
<DockPanel>
<GroupBox Header="Existing Users" Name="groupBox1" DockPanel.Dock="Top" Height="50">
<StackPanel Orientation="Horizontal">
<Label Margin="3,3,0,0">User:</Label>
<ComboBox Width="100" Height="21" Margin="3,3,0,0"></ComboBox>
<Button Width="50" Height="21" Margin="3,3,0,0" Name="btnUsersEdit" Click="btnUsersEdit_Click">Edit</Button>
<Button Width="50" Height="21" Margin="3,3,0,0" Name="btnUsersNew" Click="btnUsersNew_Click">New</Button>
</StackPanel>
</GroupBox>
<GroupBox Header="User Information" Name="groupBox2">
<Button Content="Cancel" Height="21" Name="btnCancel" Width="50" Click="btnCancel_Click" />
</GroupBox>
</DockPanel>
</TabItem>
<TabItem Header="User Groups">
</TabItem>
</TabControl>
Et c'est mon code
public partial class SystemMaintenanceWindow : Window
{
private enum TEditMode { emEdit, emNew, emBrowse }
private TEditMode _EditMode = TEditMode.emBrowse;
private TEditMode EditMode
{
get { return _EditMode; }
set
{
_EditMode = value;
}
}
public SystemMaintenanceWindow()
{
InitializeComponent();
var view = CollectionViewSource.GetDefaultView(tabControl.Items.SourceCollection);
view.CurrentChanging += this.Items_CurrentChanging;
}
void Items_CurrentChanging(object sender, CurrentChangingEventArgs e)
{
if ((e.IsCancelable) && (EditMode != TEditMode.emBrowse))
{
var item = ((ICollectionView)sender).CurrentItem;
e.Cancel = true;
tabControl.SelectedItem = item;
MessageBox.Show("Please Save or Cancel your work first.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private void btnUsersNew_Click(object sender, RoutedEventArgs e)
{
EditMode = TEditMode.emNew;
}
private void btnUsersEdit_Click(object sender, RoutedEventArgs e)
{
EditMode = TEditMode.emEdit;
}
private void btnCancel_Click(object sender, RoutedEventArgs e)
{
EditMode = TEditMode.emBrowse;
}
}
Excuses maintenant, si je suis stupide, mais pour la vie de moi je ne peut pas séance d'entraînement de voir pourquoi mon événement ne se déclenche lorsque l'utilisateur clique sur les onglets.
Merci à tous pour votre aide.
Emlyn
OriginalL'auteur Emlyn | 2011-02-23
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé une solution qui convient à mes besoins. Semble légèrement vers l'arrière, mais en comparaison avec les autres options je me suis trouvé semble agréable et soigné.
Fondamentalement, je vais le garder une variable privée de l'actuel tabIndex et sur "SelectionChanged" événement de l'tabControl je suis en train de faire quelques vérifications et de définir le tabControl.SelectedIndex à cette valeur si l'utilisateur n'est pas en mode de navigation.
OriginalL'auteur Emlyn
J'ai eu du mal avec ce trop. Il suffit de travailler en ajoutant simplement le
paramètre pour le TabControl. A travaillé comme un charme après.
OriginalL'auteur robertmiles3
Selon ce post
https://social.msdn.microsoft.com/Forums/vstudio/en-US/d8ac2677-b760-4388-a797-b39db84a7e0f/how-to-cancel-tabcontrolselectionchanged?forum=wpf
cela a fonctionné pour moi:
OriginalL'auteur clemensoe
Josh est à l'aide de
tab.ItemsSource
. Vous utiliseztab.Items.SourceCollection
. Ce pourrait être le problème.OriginalL'auteur Daniel Hilgarth
Ou de mettre en œuvre vous-même...
if (dontAllowTabChange) { eventargs.Cancel = true; Dispatcher.BeginInvoke(new Action(() => { MessageBox.Show("Please save changes before leaving this tab.", "Warning", MessageBoxButton.OK, MessageBoxImage.Exclamation); })); }
OriginalL'auteur Sam L.
Je commence à saisir XAML et j'espère donc ne manquez pas votre point de vue. J'ai eu le même problème et pour moi ce qui a le mieux fonctionné.
En XAML je définir un Style qui permet de basculer l'État 'ReadOnly'
Dans le viewmodel j'ai une propriété
Espère que cette aide.
OriginalL'auteur Schlomo