WPF:仅从一个特定内容处理冒泡事件

时间:2010-07-09 11:01:30

标签: wpf event-bubbling routedevents

现在我要学习RoutedEvents了。我理解冒泡和隧道等等。但我有一点问题,我不知道如何处理。

我在自己定义的UserControl中有一个ItemsControl(继承TabItem)。这个itemsControl可能是一个ListBox或一些尚未确定的选择器(取决于此解决方案的最佳选择)。

现在,当选择了一个项目时(不确定最佳选择方法是什么,也许是双击)我需要捕获包含UserControl的TabControl中的事件。值得庆幸的是,当我的userControl被放入XAML visualtree时,冒泡事件会向上流动,事件可以到达TabControl。但是我仍然有一些实现这个问题。

1)假设我将其设置为MouseDoubleClick我不会选择其他DoubleClick(如在其他标签中或在ItemsControlItems之外)。我想你总是可以检查来自哪里的事件,以确保它是正确的,但我觉得这是正确的方式,它可能会有问题。

2)如果我将事件设置为SelectionChanged并将ItemsControl设置为ListBox,则必须确保ListBox本身不处理它以便它可以到达tabControl。我该怎么做?

3)与2)相同,但TabControl本身就是一个选择器,因此它会提升它自己的selectionchange事件。怎么会这样呢?处理程序是否会从列表框和TabControl中获取它们?

4)不确定我应该使用哪些ItemsControl。如果我只是用它来双击项目然后处理事件将不会ListBox太多。它有许多效果,如选择等不可取。是否更好的定义自己的ItemsControl或者可能使用ListBox并覆盖其中一些属性,如选择(如何做到这一点?)?

5)事件的来源是ItemsContainer,但我不是项目本身。有一种简单的方法可以访问它吗?

6)假设我放了一个按钮,在DataTemplate中我不想通过按钮附加对象的ID,并将其捕获到处理按钮点击的位置以识别它是什么项目。是否有财产可以做到这一点,还是我必须自己定义?

7)这里最好的行动方案是创建我自己的活动吗?

您对这个问题的看法以及对最适合采取何种流程的评论是适当的。

编辑:决定按要求添加更多信息。

我的目标是什么;当我启动程序时,我有一个带有1个选项卡的TabControl。此选项卡与其他选项卡不同,因为它包含对象列表(CompanyModel)。这个列表是我提到的ItemsControl。当您从此列表中按下一个公司时,会添加一个新选项卡,其中包含有关该公司的信息。

我的解决方案是创建一个TabItem集合作为TabControl的源。然后我将在一个单独的XAML源文件中定义我的两种类型的TabItems(不确定要调用它,基本上添加新的usercontrol)。一个是列表出现的初始值,另一个是作为构造函数参数接受CompanyModel并显示有关该信息的信息。

虽然我不喜欢单独定义公司列表tabitem的想法但我不能在tabcontrol下定义它,因为我只能定义项目或来源,而不是两者。

我已经通过在List DataTemplate上放置一个按钮来尝试这个想法,该按钮将所选公司的Id冒充到TabControl,在那里处理它并添加一个带有CompanyModel的新TabItem。这只是一个尝试它的解决方案,并且存在一些问题,例如,如果我将一个按钮添加到CompanyTabs,我会在TabControl中抓住它们。

所以我的问题可以通过找到一个从原始listTab冒泡事件的好方法来解决,或者如果我能够在与TabControl相同的位置定义选项卡。

我知道另一个解决方案是将列表与TabControl分开,但其他人希望看到这是如何产生的,我想知道如何做到这一点。

1 个答案:

答案 0 :(得分:0)