C# 路由事件的TargetType
对于样式,我们有C# 路由事件的TargetType,c#,wpf,mvvm,C#,Wpf,Mvvm,对于样式,我们有TargetType,因此我们可以说请,只有按钮: 并将其附加到每个孩子上,如下所示: <ListBox SelectionChanged="Stop"> ... </ListBox> ... 然而,想象一下有数百个孩子,在某个时候我们决定给他们的父母制作动画。现在我们必须遍历所有子项并将它们附加到血腥事件处理程序。对吧? 不,不对。应该少了些什么。指定范围、类型或任何内容的能力(使事件触发器对声明严格)。或者是一些肮脏的黑客。有人知道这样的事
TargetType
,因此我们可以说请,只有按钮:
并将其附加到每个孩子上,如下所示:
<ListBox SelectionChanged="Stop">
...
</ListBox>
...
然而,想象一下有数百个孩子,在某个时候我们决定给他们的父母制作动画。现在我们必须遍历所有子项并将它们附加到血腥事件处理程序。对吧?
不,不对。应该少了些什么。指定范围、类型或任何内容的能力(使事件触发器对声明严格)。或者是一些肮脏的黑客。有人知道这样的事吗
备注:标记为MVVM,因为如果可以避免,代码隐藏就没有那么好。我认为您的问题是由
TabControl
和ListBox
覆盖了。但是,我同意您的意见,如果(正如我们所做的)我们指定要使用重写的TabControl
事件,则不应将其与Listbox.SelectionChanged
事件混淆。甚至在网站上留下bug报告也可能是个好主意
然而,我可以想到一个解决方案,但它可能不适合您。。。这实际上取决于当列表框的选择发生变化时您正在做什么。我们可以做的是为每个列表框.SelectionChanged
事件添加一个处理程序,并将SelectionChangedEventArgs.Handled
属性设置为true
,这样它就不会干扰选项卡控件的SelectionChanged
事件:
<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>
如果您想在ListBox
上的选择更改时执行某些操作,那么我建议您使用SelectedItem
属性来管理它,这样您就不会错过ListBox.SelectionChanged
事件。我不确定是否理解。。。你在为每一位家长制作动画?您想要实现什么?我们为样式
提供了TargetType
,因此我们可以说“请”,只有按钮。。。这是不正确的。我们告诉框架,样式
的类型为按钮
,这样它就可以知道需要哪些属性,以及是否向我们发出错误警报。+1用于查找有趣的问题。
private void Stop(object sender, SelectionChangedEventArgs e)
{
e.Handled = true;
}
<ListBox SelectionChanged="Stop">
...
</ListBox>
<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;
}