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();
                }
            }
        }
版权声明:本文为博主原创文章,欢迎转载,仅请署名

相关文章推荐

C++指针数组与数组指针的比较

// test1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "iostream" using namespace std; /** ...

VS2010, WPF工程添加图片资源

在WPF工程里添加图片资源,可以按如下操作: 1. 在工程下创建新文件夹 2. 把图片放到新建的目录下,在VS项目中右键点击该文件夹,选择添加已有项目 3. 添加文件成功 4. 如果不显示图片,关闭当...

WPF:TabItem的Header拉伸的TabControl

  • 2017年03月07日 10:55
  • 57KB
  • 下载

WPF控件TabControl和TabItem原模板分析

一、通过Blend查看TabControl模板代码 二、tabControlStyleAndTemplate.xaml代码

WPF TabItem Header 自定义样式

1 外部边框 ...

WPF中TabItem的Margin属性设置记录

下午搞WPF,弄一个选项页,这给难搞的··· 由于没有学过WPF,所以误以为Margin和css的样式一样。。。好坑啊。 PS:这里只是针对TabControl 的 TabItem 的 Margi...
  • n0noper
  • n0noper
  • 2016年07月01日 18:37
  • 666

解决Win7系统提示调查路由器或访问点问题的方法

最近有win7系统用户在使用无线的时候,会遇到突然弹出一个窗口,提示调查路由器或访问点的问题,重启路由器,开关电脑都没有用!这该怎么解决呢?下面就以windows7 64位旗舰版系统为例;脚本小编就给...

从ListView与ScrollView的冲突调查android view的事件处理机制

当我们做项目时经常会遇到整体界面需要滑动,此页面中又有ListView的 情况。比如说:某法院系统的提交诉讼材料界面,这种界面要提交很多元素,其中想证人可能有多个,就会用到ListView。但这种Sc...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WPF中PreviewMouseDownEvent的系统处理:TabItem的PreviewMouseDown 事件弹框后不切换的问题调查
举报原因:
原因补充:

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