2012-09-19 28 views
0

我有一个TabControl与两个TabItems,在一个TabItem里面我有一个DataGrid。 我试图处理TabItem点击,它的工作原理,但是,当我点击“dataGrid1”的一行时,TabItem点击事件“TabItem_MouseLeftButtonUp”也被触发。看到代码:DataGrid里面的TabItem事件处理

<TabControl Height="211" HorizontalAlignment="Left" Margin="33,29,0,0" Name="tabControl1" VerticalAlignment="Top" Width="417" > 
     <TabItem Header="tabItem1" Name="tabItem1"> 
      <Grid /> 
     </TabItem> 
     <TabItem MouseLeftButtonUp="TabItem_MouseLeftButtonUp"> 
      <DataGrid AutoGenerateColumns="True" Height="134" Name="dataGrid1" Width="307" /> 
     </TabItem> 
</TabControl> 

注:因为我使用MahApps我不能使用个性化<TabItem.Header>,如果我用TabItem.Header风格操作系统的TabItem将打破。

回答

0

MouseLeftButtonUp事件冒泡路由事件。当你在DataGrid上排队时,事件冒泡通过其祖先并调用相应的处理程序,TabItem_MouseLeftButtonUpTabItem在你的情况。

在你的TabItem_MouseLeftButtonUp事件中,你可以检查谁引发了事件,哪个控件是原点。如果它不是TabItem什么也不做。

private void TabItem_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    if(sender is TabItem) 
    { 
      //do the work 
    } 
} 
+0

当单击TabItem时,OriginalSource是一个边框,并且当我在TabItem的文本上单击右边时,OriginalSource是一个TextBlock,因此,此解决方案不工作。 – Ewerton

+0

我在你的解决方案中做了一些修改sender.GetType()将返回控制类型(DataGrid或TabItem),所以,你的解决方案的工作原理,我将它标记为答案,你可以编辑它? – Ewerton

0

您将通过MouseLeftButtonUp事件接收EventArgs。只需过滤掉你需要的任何东西。