gpt4 book ai didi

c# - 将事件从样式传播到 WPF 中的 MainWindow

转载 作者:太空宇宙 更新时间:2023-11-03 10:58:34 24 4
gpt4 key购买 nike

我在单独的 XAML CustomTabItem.xaml 中有一个自定义样式,它会引发如下事件:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="myProject.CustomTabItem">
...
...

<MenuItem Header="One">
<MenuItem.Style>
<Style TargetType="{x:Type MenuItem}">
<EventSetter Event="Click" Handler="ClickNewSpaceOne"/>
</Style>
</MenuItem.Style>
</MenuItem>

...
...

</ResourceDictionary>

这很容易在我创建的名为 CustomTabItem.xaml.cs 的文件中引发一个事件:

namespace myProject
{
partial class CustomTabItem
{
private void ClickNewSpaceOne(object sender, RoutedEventArgs e)
{
//do stuff here
}
}
}

一切正常,但我现在需要在 MainWindow 中引发一个事件(当然是在事件处理程序 ClickNewSpaceOne 中),但我不知道如何传播此事件发送到 MainWindow

我找到了 this文章,但它看起来不像是相同的情况,所以如果我没有找到任何不同的文章或任何答案,我将不胜感激。

最佳答案

这种情况下使用EventSetter的做法,并不是最好的。原因如下:

  • 他绑定(bind)到应该是事件处理程序的 BAML 文件

因为它仅限于事件的全局功能,他只是在xaml.cs 文件中查找事件处理程序。也正因为如此,来自MSDN :

Event setters cannot be used in a style that is contained in a theme resource dictionary.

  • EventSetter不能在Trigger中设置

引自 link :

Because using EventSetter to wire up event handler is a compile-time feature which is plumbed through IStyleConnector interface, there is another interface called IComponentConnector which is used by the XAML compiler to wire up event handler for standalone XAML elements.

有什么替代方案?

1 - 附加依赖属性

使用附加的依赖属性及其UIPropertyMetadata,您可以实现必要的逻辑。例如:

// GetValue
// SetValue

public static readonly DependencyProperty SampleProperty =
DependencyProperty.RegisterAttached("Sample",
typeof(bool),
typeof(SampleClass),
new UIPropertyMetadata(false, OnSample));

private static void OnSample(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue is bool && ((bool)e.NewValue) == true)
{
// do something...
}
}

更多信息可以在这里找到:

How to inherit Button behaviour in WPF style?

Quit application from a user Control

How to clear the contents of a PasswordBox when login fails without databinding?

2 - 命令

WPF中的命令是非常强大的。引自 MSDN :

The first purpose is to separate the semantics and the object that invokes a command from the logic that executes the command. This allows for multiple and disparate sources to invoke the same command logic, and it allows the command logic to be customized for different targets.

在这种情况下,它们可以而且应该用于StylesTemplatesDataTemplates。在样式中,您可以设置这样的命令:

<Setter Property="Command" 
Value="{Binding DataContext.YourCommand,
RelativeSource={Relative Source AncestorType={x:Type Control}}}">

此外,如果你想引用命令,你可以将命令声明为静态属性,然后你可以使用 Static 扩展来引用它。

3 - 使用 EventTrigger 进行交互

在这种情况下,命令由 EventTrigger 调用。例如:

<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseEnter" >
<i:InvokeCommandAction Command="{Binding MyCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>

更多信息,可以在这里找到:

Using EventTrigger in XAML for MVVM

Binding WPF events to MVVM Viewmodel commands

关于c# - 将事件从样式传播到 WPF 中的 MainWindow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18563110/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com