我们有TargetType
的样式,所以我们可以说请,只有按钮:
<Style TargetType="Button">
...
</Style>
但是,举例说明这个片段:
<TabControl >
<TabControl.Triggers>
<EventTrigger RoutedEvent="TabControl.SelectionChanged">
...
</EventTrigger>
</TabControl.Triggers>
<TabItem>
<ListBox>
<ListBoxItem>1</ListBoxItem>
<ListBoxItem>2</ListBoxItem>
</ListBox>
</TabItem>
</TabControl>
当 TabControl (它甚至在xaml中指定,但不做任何事实){1}}事件发生时,我们有一些东西(例如,动画)附加到触发器。但是,当SelectionChanged
所选项目也发生变化时,也会很快发生这种情况。
这是路由事件的本质,因为ListBox
中没有处理程序,它将被路由到其父级。我们可以简单地使用
ListBox
并将其附加到每个孩子,如下所示:
private void Stop(object sender, SelectionChangedEventArgs e)
{
e.Handled = true;
}
然而,想象有数百名儿童,在某些时候我们决定为他们的父母制作动画。现在我们必须经历所有孩子并将他们附加到血腥事件处理程序。正确?
不,这不对。应该有一些东西缺失。能够指定范围或类型或任何内容(使事件触发器严格声明)。或者也许是一些肮脏的黑客。任何人都知道这样的事情吗?
P.S。:标记为MVVM,因为如果可以避免代码隐藏,代码隐藏就不那么好了。
答案 0 :(得分:0)
我认为您的问题是由TabControl
和ListBox
覆盖Selector.SelectionChanged
event引起的。但我同意你的意见,如果(我们已经)我们指定要使用重写的TabControl
事件,则不应将其与Listbox.SelectionChanged
事件混淆。甚至可以在Microsoft Connect网站上留下错误报告。
然而,有一个我能想到的修复,但它可能不适合你......这实际上取决于你在选择ListBox
es时所做的事情。我们可以做的是为每个ListBox.SelectionChanged
事件添加一个处理程序,并将SelectionChangedEventArgs.Handled
属性设置为true
,这样它就不会干扰SelectionChanged
事件的TabControl
事件。 <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
上选择更改时执行某些操作,那么我建议您使用ListBox.SelectionChanged
属性进行管理,然后您不会错过{{ 1}}事件。