有个事件路由的问题,涉及tabControl 里的tabItem,给个理由就行!

APOLLO_TS 2010-08-02 10:46:35
源代码main

<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"
mc:Ignorable="d" xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls" x:Class="SilverlightRoutedEvent.MainPage"
d:DesignWidth="640" d:DesignHeight="480">
<Grid x:Name="LayoutRoot">

<controls:TabControl Margin="20,24,24,24" Name="TabSearch">
<controls:TabItem Header="TabItem" >
<Grid >
<TextBox HorizontalAlignment="Left" Margin="56,96,0,0" VerticalAlignment="Top" Text="" TextWrapping="Wrap" Width="216" Name="CityTextBox"/>
<TextBox HorizontalAlignment="Left" Margin="56,136,0,0" VerticalAlignment="Top" Text="" TextWrapping="Wrap" Width="216" Name="ProductTextBox"/>
<TextBlock HorizontalAlignment="Left" Margin="56,225,0,0" VerticalAlignment="Top" Text="" TextWrapping="Wrap" Width="216" Height="24" Name="MsgPanelF"/>
<TextBlock HorizontalAlignment="Left" Margin="56,184,0,187" Text="" TextWrapping="Wrap" Width="216" Name="MsgPanelS"/>
<Button HorizontalAlignment="Left" Margin="276,96,0,0" VerticalAlignment="Top" Width="75" Name="AddHandlerButton" Content="添加路由事件" RenderTransformOrigin="0.32,0.409"/>
</Grid>
</controls:TabItem>
<controls:TabItem Header="TabItem">
<Grid/>
</controls:TabItem>
</controls:TabControl>

</Grid>
</UserControl>



using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SilverlightRoutedEvent
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
AddHandlerButton.Click += new RoutedEventHandler(AddHandlerButton_Click);
}
void AddHandlerButton_Click(object sender, RoutedEventArgs e)
{
TabSearch.AddHandler(UIElement.KeyDownEvent, new KeyEventHandler(TabSearch_KeyDown), true);
}
private void TabSearch_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key != Key.Unknown)
{
String msg = "The key " + e.Key.ToString();
msg += " 按下 " + (e.OriginalSource as FrameworkElement).Name;
MsgPanelF.Text = msg;
CityTextBox.Focus();
}
}

}
}




我如果把
<controls:TabControl Margin="20,24,24,24" Name="TabSearch">
<controls:TabItem Header="TabItem" >
<Grid >
------------------------------------------------------------------这个支持路由事件
变成
<controls:TabControl Margin="20,24,24,24" >
<controls:TabItem Header="TabItem" Name="TabSearch" >
<Grid >
------------------------------------------------------------------这个不支持路由事件


<controls:TabControl Margin="20,24,24,24" >
<controls:TabItem Header="TabItem" >
<Grid Name="TabSearch" >
------------------------------------------------------------------这个支持路由事件
why? tabitem不支持路由,还是我的写法有问题?
...全文
231 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
APOLLO_TS 2010-08-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jv9 的回复:]

TabItem不支持路由事件。
MSDN有解释:http://msdn.microsoft.com/en-us/library/system.windows.controls.tabitem_events(VS.95).aspx
[/Quote]

正在看!是不是链接给错了?没找到tabitem不支持事件路由的字眼。
jv9 2010-08-03
  • 打赏
  • 举报
回复
TabItem不支持路由事件。
MSDN有解释:http://msdn.microsoft.com/en-us/library/system.windows.controls.tabitem_events(VS.95).aspx
badi888 2010-08-02
  • 打赏
  • 举报
回复
应该是LZ的写法有问题
Sunpire 2010-08-02
  • 打赏
  • 举报
回复
郁闷, TabControl 的 ElementTabPanelTop、ElementTabPanelBottom、ElementTabPanelRight、ElementTabPanelLeft ,还有 ElementContentTop、ElementContentBottom、ElementContentRight、ElementContentLeft 等全是 internal 的,连protected都不是,想要派生子类也不行,
只得作罢。
Sunpire 2010-08-02
  • 打赏
  • 举报
回复
和AddHandler 无关。

应是 TabPanel 引起的问题, 准备从 TabControl 派生一个子类出来看看是不是这样。

最终在显示时, TabItem 并不是 TabControl 布局中的下级,TabPanel 才是它的下级。
jlgxy 2010-08-02
  • 打赏
  • 举报
回复


AddHandler 为指定的路由事件添加路由事件处理程序,并将该处理程序添加到当前元素的处理程序集合中。将 handledEventsToo 指定为 true 时,可为已标记为由其他元素在事件路由过程中处理的路由事件调用所提供的处理程序。 (继承自 UIElement。)


UItElement! 如果对像非继承自 UIElement,那么它的路由事件则在其父级组件或其上层容器上设置。

Sunpire 2010-08-02
  • 打赏
  • 举报
回复
LZ,我测试了好久,也证明了这个现像: TabItem没有事件路由, TabItem 容器里面的第一级控件(如Grid)的事件直接路由至 TabControl 。

原以为这是因为 TabItem 是 ContentControl 引起的,于是找了别的 ContentControl 来测试,
如 Label ,结果却发现 Label.Content 中的控件的事件能被路由至 Label。

无解中。

8,734

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧