问题标签 [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.
c# - WeakEventManager 和静态事件
我正在尝试习惯WeakEventManager
并且偶然发现以下内容:
和之间的唯一区别是,请忽略复制/粘贴错误 ;)A
B
static
nameof
我找到了关于泛型和静态类型的答案,但我想知道那WeakEventManager
是怎么A
回事?不知何故,它可以null
作为静态事件的来源。
我正在寻找一个简单的答案,为什么事件可以,static
但突然不行。static class
TEventSource
代码:
错误:
错误 CS0718
'B':静态类型不能用作类型参数
c# - 在类型上找不到事件
我有以下异常
WindowsBase.dll 中出现“System.ArgumentException”类型的未处理异常
附加信息:在类型“ConsoleApplication.ITest”上找不到“事件”事件。
在这个再现中:
为什么找不到通过接口继承的事件?此方法引发异常。
c# - 是否可以编写一个隐藏添加 WeakEventManager 处理程序和传统处理程序之间差异的类?
我有一个使用大量事件的 C# (.NET 4.6.1) 项目。我很想将所有事件处理程序移至新的 WeakEventManager 模式——以避免无休止地担心取消注册处理程序以避免内存泄漏。
但是,我必须对性能进行大量测试,并且想要一种在两种方法之间轻松切换的方法。到目前为止,我一直在使用条件编译来执行以下操作:
这行得通,但它很乱。理想情况下,我想创建一个隐藏这个的类。即创建一个内部可以使用任何一种方法的类。然后我可以更改我的所有源以将处理程序附加到新类并轻松切换(甚至将来转移到一些新方法)。
但是我看不到如何编写该类-因为我无法将事件作为参数传递-并且必须对处理程序/名称进行一些反思,这超出了我的范围。
有没有简单的方法可以做到这一点?
c# - WeakEventManager - 不调用事件处理程序
我无法重现该问题(并且项目太大而无法在此处发布,而且我不确定要发布哪些相关部分)并且我需要了解此处可能出现的问题。
我有带有静态事件的抽象类
然后我正常订阅此事件并使用WeakEventManager
:
并且由于某些原因,弱事件处理程序在被调用时不会被触发OnTest()
。一切(调用和处理程序)都在 UI 线程中运行。
我设置了断点:
- 在 上
AddHandler()
,它运行,然后类的实例持续存在。 - On
Invoke()
,它在OnTest
被调用时运行,如果我调用Test.GetInvocationList()
其中一个是DeliverEvent()
from ,我可以看到 2 个订阅者WeakEventManager
,因此事件已注册并且Invoke()
应该调用弱事件处理程序。 - 在普通事件处理程序中,它运行。
- 在弱事件处理程序中,什么都没有,这个断点永远不会被击中。
关于为什么会发生这种情况或我应该调查什么的任何想法?
我试图查看 .net资源,在那里找到答案,但有些ProtectedAddHandler
资源我找不到……我找到了,但接下来是什么?抽象方法,谁来实现?...
wpf - Microsoft.Win32.SystemEvents 事件不适用于 WeakEventManager
当我做
我OnDisplaySettingsChanged
永远不会被调用。但是,如果我改为使用正常的事件订阅,SystemEvents.DisplaySettingsChanged += OnDisplaySettingsChanged
一切正常。
这是怎么回事?
c# - 避免在短期视图模型上出现 WeakEventManager 和内存泄漏
我有使用视图显示属性的长寿模型。我视图上的 DataContext 是一个寿命很短的 ViewModel。
示例包括列表中的行视图模型。
为了避免内存泄漏,视图模型使用System.Windows.WeakEventManager
.
如果我要正常订阅,长寿模型将使视图模型保持活力。
在几乎每个视图模型中使用 WeakEventManager 似乎非常麻烦。用例看起来像 WPF 的标准用例。我是否缺少 WPF 或 C# 的基本概念来帮助我在这里编写更好的代码?
这是一个最小的示例,说明了我现在所做的事情。
我的问题是,是否有一种不那么繁琐的方式可以从短期对象订阅长期对象。或者,如果 WPF 中有一些我为此缺少的工具。
令我震惊的是,这将是标准情况。我玩的是添加一个IDisposable
界面,但这只是让我知道何时调用 dispose 以便我可以取消订阅。
我正在寻找的可能是告诉 GC 订阅不计入视图模型的生命周期和取消订阅销毁的组合 - 或者更好的解决方案。
c# - 动作<>的弱事件管理器
我知道 WeakEventManager 是申请委托的:
但是,我想使用 WeakEventManager 进行如下操作:
你对这个案子有什么建议吗?预先感谢!
wpf - WPF 弱订阅 IsEnabledChanged 事件
是否可以弱订阅UIElement.IsEnabledChanged
事件?
既不是WeakEventManager<TEventSource, TEventArgs>
似乎有效,因为DependencyPropertyChangedEventArgs
不扩展TEventArgs
。
也不是PropertyChangedEventManager
确实有效,因为UIElement
没有实施INotifyPropertyChanged
!人们应该如何安全地订阅该事件?
c# - 是否可以为 UIElement.LayoutUpdated 实现 WeakEventManager?
我有一个使用 LayoutUpdated-events 并需要注册它们的应用程序。这是问题,我在执行 WeakEventManager 期间遇到了问题
这就是发生的事情:
- 我们总是收到 null 作为发件人(根据 LayoutUpdated 的设计)
- 该 null 被传递到 DeliverEvent
- DeliverEvent 无法查找正确的 ListenerList,因为它需要一个 sender != null 作为键
WPF中的失败查找:WeakEventManager // DeliverEvent // 行:359
我的问题是:有没有办法弱注册到 LayoutUpdated 事件?
我对 sender-parameter 不感兴趣,所以 LayoutUpdated 总是提供 null 对我来说是可以的(我使用常规“+=”的实际实现有效)。但是 WeakEventManager 基类依赖 sender-parameter 来跟踪 ListenerList。
c# - WINUI 3.0 - 缺少 WeakEventManager
我在 WINUI3 中找不到 WeakEventManger 类。
当我订阅比 ViewModel 寿命更长的模型事件时,我所有的 WPF 项目都会在视图模型中使用它。
具有长寿模型的 ViewModel 必须是一种常见的东西。
例如订阅剪贴板的短期视图模型。
WINUI3最好的评价是什么?