2

我试图通过使用委托或使用类实例作为参数来稍微优化我的代码。我对 C# 很陌生,我还不确定哪一个是更好的方法,假设我一开始就走在正确的轨道上。但我的问题与发送一个类实例作为参数有关。让我解释。我试图遵循这个逻辑,但我失败了......
我创建了一个带有几个按钮的 VSTO 功能区。它看起来有点像这样:
丝带
现在,我正在尝试向按钮添加一些功能,因此单击每个按钮都会打开一个新的 TaskPane。

我为注释Calendar中的功能区按钮编写了这段代码GSMRibbon.cs :我认为对于更有经验的程序员来说,这段代码会很容易理解,但如果你们不明白,请在评论中告诉我,我会解释)。

namespace GSM
{
    public partial class GSMRibbon
    {
        private void GSMRibbon_Load(object sender, RibbonUIEventArgs 
        {
        }

        private CustomTaskPane taskPane;

        private CustomTaskPane TaskPane
        {
            get
            {
                return this.taskPane;
            }
        }

        private void vendors_calendar_Click(object sender, RibbonControlEventArgs e)
        {
            string newTitle = "PO Calendar";

            if (TaskPane != null)
            {
                if (TaskPane.Title != newTitle)
                {
                    Globals.ThisAddIn.CustomTaskPanes.Remove(TaskPane);
                    CreateTaskPane(newTitle);
                }
                else
                {
                    taskPane.Visible = true;
                }
            }
            else
            {
                CreateTaskPane(newTitle);
            }
        }

        private void CreateTaskPane(string title)
        {
            var taskPaneView = new CalendarView();
            taskPane = Globals.ThisAddIn.CustomTaskPanes.Add(taskPaneView, title);
            taskPane.Visible = true;
        }
    }
}

好的。我想要做的是修改 CreateTaskPane 函数添加一个class参数(这有意义吗?)所以我可以多次重复使用此函数用于功能区上的不同按钮。我View为每个按钮创建了一个单独的按钮,但我不确定如何通过View.
所以,我在这样的事情之后:(CalendarView 是视图的名称)

CreateTaskPane(new CalendarView(), newTitle);

和类似的功能:

private void CreateTaskPane(object typeOfView, string title)
{
    var taskPaneView = new (typeOfView)Object;
    taskPane = Globals.ThisAddIn.CustomTaskPanes.Add(taskPaneView, title);
    taskPane.Visible = true;
}

我真的希望你能理解我正在努力但我无法做到的事情。我感谢任何尝试提供帮助。谢谢

4

2 回答 2

3

您可以使用泛型来执行此操作:

private void CreateTaskPane<T>(string title) where T : UserControl, new()
{
    T taskPaneView = new T();
    taskPane = Globals.ThisAddIn.CustomTaskPanes.Add(taskPaneView, title);
    taskPane.Visible = true;
}

然后,您可以通过以下方式调用它:

CreateTaskPane<CalendarView>(newTitle);

或者,你可以这样写:

private void CreateTaskPane<T>(T taskPaneView, string title) where T : UserControl
{
    taskPane = Globals.ThisAddIn.CustomTaskPanes.Add(taskPaneView, title);
    taskPane.Visible = true;
}

然后通过以下方式调用:

CreateTaskPane(new CalendarView(), newTitle);
于 2013-06-18T16:20:58.343 回答
1

你似乎在寻找的是泛型

你最终会得到的功能是这样的:

private void CreateTaskPane<T>(string title) where T : UserControl, new()
{
   var taskPaneView = new T();
   taskPane = Globals.ThisAddIn.CustomTaskPanes.Add(taskPaneView, title);
   taskPane.Visible = true;
}

// Later on..
CreateTaskPane<CalenderTaskPane>("Calender");
于 2013-06-18T16:21:23.567 回答