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

??

背景:

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

}

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-20 13:55:52

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

vue中对element的弹框messagebox的二次封装

在vue中对确认框的二次封装 使用场景:在页面中做某些需要警告的操作时的弹框提示 1.在utils文件夹下新建一个confirm.js文件来对messageBox的封装,内容如下: /** confirm.js */ import { MessageBox } from 'element-ui' export function handleCofirm(text = '确定执行此操作吗?', type = 'warning') { return MessageBox.confirm(text,

vue中的父子组件之间的通信--新增、修改弹框

在一个vue页面中有时候内容会很多,为了方便编写查看,可以分为多个子组件,最后在父组件中引入对应的子组件即可. 下面这个是父子组件通信中的一个具体实例:新增.修改弹框. 子组件中主要写了关于新增.修改的弹框, 子组件: 1.弹框: <div class="newDocuments"> <div class="newDocuments_center"> <div class="center_header"> &l

wpf 窗体中显示当前系统时间

先看一下效果: 这其实是我放置了两个TextBlock,上面显示当前的日期,下面显示时间. 接下来展示一下代码: 在XAML中: <StackPanel Width="205"                    Margin="0,0,57,0"                    HorizontalAlignment="Right">            <TextBlock Height="Auto&qu

浏览器扩展系列————在WPF中定制WebBrowser快捷菜单

原文:浏览器扩展系列----在WPF中定制WebBrowser快捷菜单 关于如何定制菜单可以参考codeproject上的这篇文章:http://www.codeproject.com/KB/books/0764549146_8.aspx?fid=13574&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=26#xx0xx 本文主要讲述如何在这篇文章中的ShowContextMenu方法中弹出自己的Conte

WPF中的导航框架(一)——概述

有的时候,我们需要一个支持页面跳转的UI,例如文件浏览器,开始向导等.对于这样的界面,简单的可以使用ContentControl + ContentTemplateSelector的方式来实现,但是有的时候我们会需要一些更加高级的跳转功能,如前进,回退等.这个时候,用这个方式就稍微有点力不从心了,此时,我们可以使用WPF的导航框架帮助我们快速实现这一功能. WPF 的Page框架主要包括两个部分,容器和页面, 下面就以一个简单的例子来介绍WPF的Page框架,首先我们创建第一个页面: <Page

WPF中嵌入普通Win32程序的方法

公司现在在研发基于.Net中WPF技术的产品,由于要兼容旧有产品,比如一些旧有的Win32程序.第三方的Win32程序等等,还要实现自动登录这些外部Win32程序,因此必须能够将这些程序整合到我们的系统中来,让使用者看起来它们好像是一个程序. 在MSDN中有专门的章节提到了在WPF中嵌入Win32控件的办法,那就是使用 HwndHost ,只要把 Win32控件的句柄传递给 HwndHost 就可以了.MSDN中的例子演示的都是在同一个进程内创建的 Win32控件,我一开始认为只要通过FindW

二维图形的矩阵变换(三)——在WPF中的应用矩阵变换

UIElement和RenderTransform 首先,我们来看看什么样的对象可以进行变换.在WPF中,用于呈现给用户的对象的基类为Visual类,但是Visual对象并不具有变换功能,具有变换功能的是它的子类UIElement.这个类也是非常底层的类了,几乎我们所有的常用控件都是继承自它,也就是说,基本上所有的UI对象都是可以应用变换的. 然后,我们在再来看看UIElement中变换种类.UIElement支持两种变换:RenderTransform和LayoutTransform,其中La

WPF中实现先登录后启动主程序的方法

[转载] http://blog.csdn.net/swarb/article/details/17301167 WPF中实现先登录后启动主程序的方法 我觉得先登录后启动应用主程序是一个很经典的问题,基本上如果要写一个应用程序都会用到这个的小环节.我在这个问题上挣扎了大半天才找到解决方案,我的实现方法我觉得有点不正宗,如果有哪位高手知道更好的方法欢迎留言指导!! 首先来说一下传统C#在WinForm中的实现方法,基本上是在Main函数中根据第一个启动窗口的DialogResult来判断是否实例第

WPF中DPI的问题

先搞清楚一下几个概念: DPI:dots  per  inch ,每英寸的点数.我们常说的鼠标DPI,是指鼠标移动一英寸的距离滑过的点数:打印DPI,每英寸的长度打印的点数:扫描DPI,每英寸扫描了多少个点.(更多请参考百度百科http://baike.baidu.com/view/49853.htm) 像素:pixel,picute和element的缩写.像素可以简单的理解为DPI里面的点.例如,显示器的分辨率为1024像素*768像素,就是说显示器的横向可显示1024个点(像素),纵向科研可