CSharp - 路由事件的TargetType

  显示原文与译文双语对照的内容
0 0

我们有 TargetType 样式,所以我们可以说 ,只有按钮:


<Style TargetType="Button">
. . .
</Style>

但是,以下面的代码Fragment为例:


<TabControl> 
 <TabControl.Triggers>
 <EventTrigger RoutedEvent="TabControl.SelectionChanged">
. . .
 </EventTrigger>
 </TabControl.Triggers>
 <TabItem>
 <ListBox>
 <ListBoxItem>1</ListBoxItem>
 <ListBoxItem>2</ListBoxItem>
 </ListBox>
 </TabItem>
</TabControl>

我们在 ( 它甚至在xaml中被指定,但是不做任何事情) SelectionChanged 事件发生时,附加了一些( 例如动画) 。 然而,当 ListBox 选择项被更改时,会很高兴地发生。

它是路由事件的本质,因为在 ListBox 中没有任何处理程序,它将被路由到它的父。 我们可以用后面的代码


private void Stop(object sender, SelectionChangedEventArgs e)
{
 e.Handled = true;
}

并将它的附加到每个子 ,如下所示:


 <ListBox SelectionChanged="Stop">
.. .
 </ListBox>

然而,假设有数百个孩子,在某个时刻我们决定对它们的父。 现在我们必须所有孩子,并将它们附加到血腥事件处理程序 。 对吧?

不不对应该有一些缺失。 能够指定用户定义的作用域类型类型类型类型或者任何其他类型。 或者一些肮脏的hack 。 任何人都知道这样的事情?

,: 标记为,因为如果可以避免它的话,代码就不好了。

时间: 原作者:

0 0

我相信你的问题是因为 TabControlListBox 都重写了 Selector.SelectionChanged 事件。 但是,如果指定了重写事件,这就不应该与 Listbox.SelectionChanged 事件混淆,那么我同意你同意。 它甚至可能是在 Microsoft Connect 网站上留下一个 Bug 报表。

然而,我可以想到一个修复,但它可能不适合你。 这确实取决于 ListBox的选择改变时你正在做什么。 接下来可以将处理程序添加到每个 Listbox.SelectionChanged 事件,并设置 SelectionChangedEventArgs.Handled 属性为 true,使它不会干扰 TabControlSelectionChanged 事件:


<TabControl>
 <TabControl.Triggers>
 <EventTrigger RoutedEvent="TabControl.SelectionChanged">
 <BeginStoryboard>
 <Storyboard>
 <DoubleAnimation From="0.25" To="1.0" Duration="0:0:1" 
 Storyboard.TargetProperty="Opacity"/>
 </Storyboard>
 </BeginStoryboard>
 </EventTrigger>
 </TabControl.Triggers>
 <TabItem Header="Tab 1">
 <ListBox SelectionChanged="ListBox_SelectionChanged">
 <ListBoxItem>1</ListBoxItem>
 <ListBoxItem>2</ListBoxItem>
 </ListBox>
 </TabItem>
 <TabItem Header="Tab 2">
 <ListBox SelectionChanged="ListBox_SelectionChanged">
 <ListBoxItem>1</ListBoxItem>
 <ListBoxItem>2</ListBoxItem>
 </ListBox>
 </TabItem>
</TabControl>


private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
 e.Handled = true;
}

如果你想在 ListBox 上的选择更改时进行某些操作,那么我建议你使用 SelectedItem 属性来管理这个事件。

原作者:
...