WPF中PreviewMouseDownEvent的系统处理:TabItem的PreviewMouseDown 事件弹框后不切换的问题调查

原创 2015年07月07日 22:44:10

背景:
UI中有一个TabControl, 包含2个TabItem,当切换到别的TabItem时可能弹框然后根据逻辑判断是否跳转过去。
然后我就做了这样一个demo:

xaml:

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d ="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc ="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:i ="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:ic ="http://schemas.microsoft.com/expression/2010/interactions"
    xmlns:local ="clr-namespace:WpfApplication4"
    mc:Ignorable ="d"
    x:Class ="WpfApplication4.MainView"
    d:DesignWidth ="640"
    d:DesignHeight ="480" >

    <Grid
        x:Name ="LayoutRoot" >
        <TabControl
            x:Name ="tbcTest"
            SelectionChanged="TabControl_SelectionChanged" >
            <TabItem
                x:Name ="tiItem1"
                Header="TabItem1" >
                <Grid
                    Background="#FFE5E5E5" >
                    <Button
                        Content="Button"
                        VerticalAlignment="Top"
                        Margin="73,197,142,0" />
                </Grid>
            </TabItem>
            <TabItem
                x:Name ="tiItem2"
                Header="TabItem2"
                PreviewMouseLeftButtonDown="TabItem_PreviewMouseLeftButtonDown" >
                <Grid
                    Background="#FFE5E5E5" >
                    <RadioButton
                        Content="RadioButton"
                        HorizontalAlignment="Left"
                        VerticalAlignment="Top" />
                </Grid>
            </TabItem>
        </TabControl>
    </Grid>
</UserControl>


C# code:

using System .Windows;
using System .Windows. Controls;

namespace WpfApplication4
{
    public partial class MainView : UserControl
    {
        public MainView ()
        {
            // Required to initialize variables
            InitializeComponent();
        }

        private void TabControl_SelectionChanged( object sender , System.Windows .Controls. SelectionChangedEventArgs e )
        {
            System.Diagnostics .Debug. WriteLine("SelectionChanged..." );
        }

        private void TabItem_PreviewMouseLeftButtonDown(object sender, System.Windows .Input. MouseButtonEventArgs e )
        {
            System.Diagnostics .Debug. WriteLine("PreviewMouseLeftButtonDown" );

                MessageBox.Show ("Test Modal Window");
        }
    }
}


问题来了:
当点击第2个tabItem弹框后,tabControl并没有切换过去。

原因:
通过snoop的event分析后, 发现区别在于当弹框后焦点在Window上而不是TabItem上。 
(1)没有弹messagebox的事件
(2)弹messagebox后的事件


解决办法:
很简单,不需要指定TabControl的SelectedItem, 不需要RaiseEvent。只需在MessageBox之后调用Focus()。

private void TabItem_PreviewMouseLeftButtonDown(object sender, System.Windows .Input. MouseButtonEventArgs e )
        {
            System.Diagnostics .Debug. WriteLine("PreviewMouseLeftButtonDown" );

            if (_isPopupMsgBox )
            {
                MessageBox.Show ("Test Modal Window");
            }

            if (_isPopupMsgBox )
            {
                var tabItem = sender as TabItem ;
                if (tabItem != null)
                {
                    //当在当前的界面上弹出二级界面再次关闭后,
                    //焦点默认在当前窗体上,导致后续MouseDown事件并没有在TabItem上生效。
                    tabItem.Focus();
                }
            }
        }
版权声明:本文为博主原创文章,欢迎转载,仅请署名 举报

相关文章推荐

WPF中PreviewMouseDownEvent的系统处理:TabItem的PreviewMouseDown 事件弹框后不切换的问题调查

背景:UI中有一个TabControl, 包含2个TabItem,当切换到别的TabItem时可能弹框然后根据逻辑判断是否跳转过去。然后我就做了这样一个demo:xaml:UserControl ...

关于应用内主题切换的三种方式

三个开源的项目: MultipleTheme Colorful  AndroidChangeSkin 当前更换主题的方式如下: Theme: 设置Theme来切换不同主题。 ...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

WPF中的事件列

WPF中的事件列表 ListBoxItem.Selected 选取 ListBoxItem 时发生。 ListBoxItem.Unselected 取消 ListBoxItem 选取时发生。 Med...

java中的问题

1.举例说明应用RandomAccessFile类进行随机文件读写的一般步骤 2.为什么InputStream和OutputStream类不能够实例化? 3. FileInputStream和File...

ListView中的item中的Onclick事件的优化

ListView中的item中点击事件的优化

ViewGroup的touch事件总结

通过intercept和dispatchTouchEvent返回值来控制touch事件

View及ViewGroup的事件分发及传递(一)

转载前说明: 写这篇博客的缘由不是因为在网上看到了关于Android事件分发的文章,而是一方面因为面试中被问到了,一直在使用却没有真正了解过其原理,另一方面是因为想更多更深入的学习一下。因此在网...

vba中text的问题和VBA自动调用的问题

问题:vba中text与value? 补充: excel2013 中,可以运算的值和显示值。 我想凡是单元格数值为3,就显示为B if [a1].value=3 then [a1].text...

ios中的三种弹框

目前为止,已经知道3种IOS弹框: 1、系统弹框-底部弹框 UIActionSheet  (1)用法:处理用户非常危险的操作,比如注销系统等 (2)举例: UIActionSh...

android中Touch事件的处理逻辑

android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解。 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOW...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)