【问题标题】:return a string value from an EventHandler void从 EventHandler void 返回一个字符串值
【发布时间】:2020-10-23 19:36:32
【问题描述】:

我正在使用 EventHandler 来检查在 Autocad 中单击了哪个按钮,唯一的问题是我不知道如何从 void 返回字符串值并在主类中使用它。能得到一些帮助会很棒!

Autodesk.Windows.ComponentManager.ItemExecuted += new EventHandler<Autodesk.Internal.Windows.RibbonItemExecutedEventArgs>(ItemExecutedTest);
void ItemExecutedTest(object sender, Autodesk.Internal.Windows.RibbonItemExecutedEventArgs e)
{
string scriptName = e.Item.Text;
}

string script = scriptName;

【问题讨论】:

  • 这个问题有点模糊(至少对我来说是这样),那是谁的事件?是你写的,谁在抬杠?它是否包含您可以使用的字符串属性
  • 将该值保存到静态字段并将其放在您希望使用的位置。
  • @Arphile 不过,它不需要是静态的。
  • @Fildor 但没有 out 方法对吗?如果 EventArgs 不包含 String 返回字段,则静态是解决此问题的最佳方法。
  • @Arphile 为什么?您所需要的只是定义 Handler 的类中的私有属性或字段。我不明白为什么静态应该是必要的或有益的,在这里。

标签: c# .net void eventhandler autodesk


【解决方案1】:

您显然无法更改 EventHandler 的返回类型,这样做也无济于事。您需要做的是:设置一个类字段或属性。

例子:

public class Example
{

    private string ScriptName {get; set;} = string.Empty;

    public Example()
    {
         // register events
         Autodesk.Windows.ComponentManager.ItemExecuted += new EventHandler<Autodesk.Internal.Windows.RibbonItemExecutedEventArgs>(ItemExecutedTest);
    }

    void ItemExecutedTest(object sender, Autodesk.Internal.Windows.RibbonItemExecutedEventArgs e)
    {
         ScriptName = e.Item.Text;
         // class property now contains e.Item.Text
    }
}

注意:如果您在该处理程序中访问 UI-Items,您需要检查您是否*) 在 UI 线程上并可能对其进行编组。

*) "你是" 就像 "如果处理程序在 UI 线程上执行" ;)

【讨论】:

    【解决方案2】:

    从事件处理程序向事件调用者传递值的唯一正常方式是通过事件参数。您还应该添加一个标志,例如IsHandled 可以设置为 true。 肮脏的方法是使处理程序非 void。

    【讨论】:

    • 为什么你认为OP想要返回一个事件源已经知道的值? "...并在 在主类中使用它 "(我强调)我得出结论,该字符串应该在 handles的类中是已知的> 事件。
    • 我不知道...有些人有奇怪的问题。
    • “肮脏的方法是让处理程序非 void。” 你不能这样做。这显然是 CAD 软件的一些插件,并且该处理程序很可能是它的接口,所以你被 public delegate void EventHandler&lt;TEventArgs&gt;(object sender, TEventArgs e); 所困扰
    • 嗯,问题是“从 EventHandler void 返回一个字符串值”......我只是给他提供了可能性。显然,OP提出的问题与提供的场景无关。答案是“你不能”。您只能将其作为静态公共字段/属性传回,或者在某处使用单例类来存储数据。两种解决方案都很脆弱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 2014-10-20
    相关资源
    最近更新 更多