c# - WPF 选项卡控件防止选项卡更改

标签 c# wpf

我正在尝试为我的应用程序开发一个系统维护屏幕,其中我有几个选项卡,每个选项卡代表不同的维护选项,即维护系统用户等。一旦用户点击编辑/新建以更改现有记录,我想阻止导航离开当前选项卡,直到用户点击保存或取消。

谷歌搜索后,我找到了一个链接 http://joshsmithonwpf.wordpress.com/2009/09/04/how-to-prevent-a-tabitem-from-being-selected/这似乎解决了我的问题,或者我是这么认为的。

我试过实现这个,但我的事件似乎从未触发过。下面是我的 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>

这是我的代码

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

如果我是愚蠢的,现在道歉,但对于我的生活,我无法了解为什么当用户在选项卡之间单击时我的事件没有触发。

感谢您的帮助。

埃姆林

最佳答案

我想出了一个适合我需要的解决方案。看起来有点倒退,但与我发现的其他选项相比,它看起来漂亮整洁。

基本上我保留了当前 tabIndex 的私有(private)变量和 TabControlSelectionChanged 事件,我正在做一些检查并设置 TabControl.SelectedIndex 如果用户未处于浏览模式,则返回此值。

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

关于c# - WPF 选项卡控件防止选项卡更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5090392/

相关文章:

c# - Swagger - Web API - 可选查询参数

c# - 在不运行应用程序的情况下调试 WPF 窗口或 Windows 窗体?

c# - 具有 DiffuseMaterial 的 ModelVisual3D 的透明度

c# - 在没有 ViewModel 的情况下将静态 ICommand 绑定(bind)到 MenuItem

wpf - WPF中的 slider 开/关开关

c# - 捕获/跟踪对某个 url 的请求 - iis

c# - 如何在空列表框中使用 CTRL+V 启用粘贴?

c# - 无关类之间的事件

c# - WCF 自托管,通过控制台应用程序托管

c# - 以编程方式生成sql代码