问题标签 [weakeventmanager]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1092 浏览

c# - WeakEventManager 和静态事件

我正在尝试习惯WeakEventManager并且偶然发现以下内容:



和之间的唯一区别是,请忽略复制/粘贴错误 ;)ABstaticnameof

我找到了关于泛型和静态类型的答案,但我想知道那WeakEventManager是怎么A回事?不知何故,它可以null作为静态事件的来源。

我正在寻找一个简单的答案,为什么事件可以,static但突然不行。static classTEventSource


代码:

错误:

错误 CS0718
'B':静态类型不能用作类型参数

0 投票
1 回答
6908 浏览

c# - 在类型上找不到事件

我有以下异常

WindowsBase.dll 中出现“System.ArgumentException”类型的未处理异常

附加信息:在类型“ConsoleApplication.ITest”上找不到“事件”事件。

在这个再现中:

为什么找不到通过接口继承的事件?此方法引发异常。

0 投票
1 回答
49 浏览

c# - 是否可以编写一个隐藏添加 WeakEventManager 处理程序和传统处理程序之间差异的类?

我有一个使用大量事件的 C# (.NET 4.6.1) 项目。我很想将所有事件处理程序移至新的 WeakEventManager 模式——以避免无休止地担心取消注册处理程序以避免内存泄漏。

但是,我必须对性能进行大量测试,并且想要一种在两种方法之间轻松切换的方法。到目前为止,我一直在使用条件编译来执行以下操作:

这行得通,但它很乱。理想情况下,我想创建一个隐藏这个的类。即创建一个内部可以使用任何一种方法的类。然后我可以更改我的所有源以将处理程序附加到新类并轻松切换(甚至将来转移到一些新方法)。

但是我看不到如何编写该类-因为我无法将事件作为参数传递-并且必须对处理程序/名称进行一些反思,这超出了我的范围。

有没有简单的方法可以做到这一点?

0 投票
1 回答
926 浏览

c# - WeakEventManager - 不调用事件处理程序

我无法重现该问题(并且项目太大而无法在此处发布,而且我不确定要发布哪些相关部分)并且我需要了解此处可能出现的问题。

我有带有静态事件的抽象类

然后我正常订阅此事件并使用WeakEventManager

并且由于某些原因,弱事件处理程序在被调用时不会被触发OnTest()。一切(调用和处理程序)都在 UI 线程中运行。

我设置了断点:

  1. 在 上AddHandler(),它运行,然后类的实例持续存在。
  2. On Invoke(),它在OnTest被调用时运行,如果我调用Test.GetInvocationList()其中一个是DeliverEvent()from ,我可以看到 2 个订阅者WeakEventManager,因此事件已注册并且Invoke()应该调用弱事件处理程序。
  3. 在普通事件处理程序中,它运行。
  4. 在弱事件处理程序中,什么都没有,这个断点永远不会被击中。

关于为什么会发生这种情况或我应该调查什么的任何想法?


我试图查看 .net资源,在那里找到答案,但有些ProtectedAddHandler资源我找不到……我找到,但接下来是什么?抽象方法,谁来实现?...

0 投票
1 回答
204 浏览

wpf - Microsoft.Win32.SystemEvents 事件不适用于 WeakEventManager

当我做

OnDisplaySettingsChanged永远不会被调用。但是,如果我改为使用正常的事件订阅,SystemEvents.DisplaySettingsChanged += OnDisplaySettingsChanged一切正常。

这是怎么回事?

0 投票
1 回答
627 浏览

c# - 避免在短期视图模型上出现 WeakEventManager 和内存泄漏

我有使用视图显示属性的长寿模型。我视图上的 DataContext 是一个寿命很短的 ViewModel。

示例包括列表中的行视图模型。

为了避免内存泄漏,视图模型使用System.Windows.WeakEventManager.

如果我要正常订阅,长寿模型将使视图模型保持活力。

在几乎每个视图模型中使用 Wea​​kEventManager 似乎非常麻烦。用例看起来像 WPF 的标准用例。我是否缺少 WPF 或 C# 的基本概念来帮助我在这里编写更好的代码?

这是一个最小的示例,说明了我现在所做的事情。

我的问题是,是否有一种不那么繁琐的方式可以从短期对象订阅长期对象。或者,如果 WPF 中有一些我为此缺少的工具。

令我震惊的是,这将是标准情况。我玩的是添加一个IDisposable界面,但这只是让我知道何时调用 dispose 以便我可以取消订阅。

我正在寻找的可能是告诉 GC 订阅不计入视图模型的生命周期和取消订阅销毁的组合 - 或者更好的解决方案。

0 投票
0 回答
91 浏览

c# - 动作<>的弱事件管理器

我知道 WeakEventManager 是申请委托的:

但是,我想使用 Wea​​kEventManager 进行如下操作:

你对这个案子有什么建议吗?预先感谢!

0 投票
0 回答
178 浏览

wpf - WPF 弱订阅 IsEnabledChanged 事件

是否可以订阅UIElement.IsEnabledChanged事件?

既不是WeakEventManager<TEventSource, TEventArgs>

似乎有效,因为DependencyPropertyChangedEventArgs不扩展TEventArgs
也不是PropertyChangedEventManager

确实有效,因为UIElement没有实施INotifyPropertyChanged!人们应该如何安全地订阅该事件?

0 投票
1 回答
143 浏览

c# - 是否可以为 UIElement.LayoutUpdated 实现 WeakEventManager?

我有一个使用 LayoutUpdated-events 并需要注册它们的应用程序。这是问题,我在执行 WeakEventManager 期间遇到了问题

这就是发生的事情:

  1. 我们总是收到 null 作为发件人(根据 LayoutUpdated 的设计)
  2. 该 null 被传递到 DeliverEvent
  3. DeliverEvent 无法查找正确的 ListenerList,因为它需要一个 sender != null 作为键

WPF中的失败查找:WeakEventManager // DeliverEvent // 行:359

我的问题是:有没有办法弱注册到 LayoutUpdated 事件?

我对 sender-parameter 不感兴趣,所以 LayoutUpdated 总是提供 null 对我来说是可以的(我使用常规“+=”的实际实现有效)。但是 WeakEventManager 基类依赖 sender-parameter 来跟踪 ListenerList。

0 投票
0 回答
64 浏览

c# - WINUI 3.0 - 缺少 WeakEventManager

我在 WINUI3 中找不到 WeakEventManger 类。

当我订阅比 ViewModel 寿命更长的模型事件时,我所有的 WPF 项目都会在视图模型中使用它。

具有长寿模型的 ViewModel 必须是一种常见的东西。

例如订阅剪贴板的短期视图模型。

WINUI3最好的评价是什么?