gpt4 book ai didi

c# - 如何处理对通用类型事件的订阅?

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

我正在开发 WinForms 应用程序。在许多情况下,我需要在较小的查看区域中显示一个新的屏幕,因此我使用了面板。基本上,我从面板继承,从面板中公开我需要的信息的任何属性,在面板中显示信息所需的任何事情都发生在它自己的代码后面。这些面板将始终完全停靠在一个父控件(主窗体)上。

我创建了一个通用方法来显示这些面板:

private static T ShowPanel<T>(Control parent, params object[] parameters) where T: Panel
{
T panelToShow = (T)Activator.CreateInstance(typeof(T), parameters);

parent.Controls.Add(panelToShow);

panelToShow.Dock = DockStyle.Fill;
panelToShow.BringToFront();
panelToShow.Show();

return panelToShow;
}

我是这样使用它的,但我知道必须有更好的方法来处理事件订阅。

private void ShellButton_Click(object sender, EventArgs e)
{
if (CurrentSelectedSite == null)
{
AlertSelectSite();
return;
}

SystemViewPanel panel = ShowPanel<SystemViewPanel>(this, CurrentSelectedSite.Systems);

panel.SystemsListbox.DoubleClick += new EventHandler(ShellAccessSystemSelected);
}

有一堆按钮可以做不同的事情。如果站点有多个系统,则会显示 SystemViewPanel 以选择要在哪个系统上执行操作。按照我现在的方式,我必须订阅一个不同的命名事件处理程序来指定我想要执行的操作,因此我的主窗体代码变得困惑(即 ShellAccessSystemSelected、DownloadFileSystemSelected、ViewSystemSystemSelected 等)。

编辑

我认为事情可以一概而论,因为我将展示一个面板,允许用户为我的应用程序中的大多数工具 选择一个系统。但是,对于每个不同的工具,需要根据启动 SystemViewPanel 创建的工具执行不同的操作。

最佳答案

您可能希望通过插入您自己的基类来概括面板的行为,该基类公开您通常希望从面板中获得的那些事件。这可能是一个开始。您还可以直接在构造函数中提供某些事件的处理程序...

SystemViewPanel panel = ShowPanel<SystemViewPanel>(
this,
panel => {
//Do the stuff you would do on click event, panel impl ensures this
// gets called at the right moment
},
CurrentSelectedSite.Systems);

因评论而更新:

您需要知道您的 lambda 需要哪些参数。如果您对标准事件处理程序的签名感到满意,您可以只使用“EventHandler”作为参数类型。然后你的 lambda 看起来像

(sender, args) => //Do stuff

除此之外,如果您调用的函数只需要面板,您可以使用 Action 委托(delegate)之一,它允许您用参数表达方法,但没有返回值。

如果您想从调用的 lmbda 返回一些值,然后由调用者(您的面板)处理,您可以使用任何 Func 代表

关于c# - 如何处理对通用类型事件的订阅?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1027884/

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