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中MouseLeftButtonDown失灵的问题

下面地址有解决办法 http://www.cnblogs.com/jlsme/articles/1391723.html
  • jetluning
  • jetluning
  • 2014年09月11日 18:35
  • 4319

wpf TabControl TabItem 被点击信息

1.直接没有消息的, 可以在 TabItem.Header中加一个Label, 让Label绑定OnClick消息, 就能实现TabItem被点击消息...
  • norsd
  • norsd
  • 2013年05月15日 08:08
  • 5539

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

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

WPF鼠标事件简介

主要有以下几种事件: 主要事件 子事件 触发条件   MouseHover   鼠标悬停在控件发生   MouseLeave   鼠标离开控件时发生 ...
  • xingxing513234072
  • xingxing513234072
  • 2013年05月21日 10:00
  • 8254

TabControl 包含UserControl触发切换TabItem失效的解决方案

RT 当前需求为TabControl内包含多个TabItem,例如TabItem1、TabItem2.... TabItem1 内包含一个自己编写的UserControl,同时注册了一个委...
  • songqingwei1988
  • songqingwei1988
  • 2015年12月08日 10:10
  • 1668

WPF——TabItem Style(选中Tab页时修改背景色)

VerticalAlignment="Center"                                                Canvas.Top="3"         ...
  • ryb666666
  • ryb666666
  • 2011年11月09日 16:45
  • 6842

鼠标事件

Uielement和ContentElement都定义了十个以Mouse开头的事件,8个以PreviewMouse开头的事件,MouseMove,PreviewMouseMove,MouseEnter...
  • qq_23018459
  • qq_23018459
  • 2018年02月09日 17:38
  • 4

WPF中的事件列表

以下是WPF中的常见事件汇总表(按字母排序),翻译不见得准确,但希望对你有用。 事件 描述 ...
  • johnsuna
  • johnsuna
  • 2007年09月12日 19:57
  • 6695

可关闭的TabItem<自定义控件>

[Veary]可关闭的TabItem,有样式.
  • u011785544
  • u011785544
  • 2015年04月27日 11:04
  • 1705

WPF TabItem Header 自定义样式

1 外部边框 ...
  • qq_15724883
  • qq_15724883
  • 2014年11月27日 07:25
  • 1145
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WPF中PreviewMouseDownEvent的系统处理:TabItem的PreviewMouseDown 事件弹框后不切换的问题调查
举报原因:
原因补充:

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