我正在构建许多winform应用程序,我将使用很多垂直菜单(并且由于没有控件已经存在,我必须使用基于RadioButtons的代码动态构建它们)所以我想要构建一个单独的DLL,将负责创建这些菜单,并在每次需要这种菜单时使用此DLL,这是用于动态创建菜单的代码的和平:
//Creating a menubutton for each item :
foreach (MenuItem menuItem in _allItems)
{
var menuButton = CreateMenuBottons(menuItem);
_allMenuButtons.Add(menuButton);
}
// Dynamicly create the RadioButton and turn it into a menuButton
private RadioButton CreateMenuBottons(MenuItem item)
{
var index = _allItems.IndexOf(item);
var menuButton = new RadioButton();
menuButton.Appearance = Appearance.Button;
menuButton.AutoSize = true;
menuButton.Dock = DockStyle.Fill;
...
...
...
...
menuButton.Tag = item.Value;
menuButton.UseVisualStyleBackColor = true;
menuButton.CheckedChanged += Radio_CheckedChanged; //My problem is here !!!
return menuButton;
}
这就是我如何检测菜单上点击了哪个按钮:
private void Radio_CheckedChanged(object sender, EventArgs e)
{
var selectedMenuButton = (RadioButton)sender;
if (selectedMenuButton.Checked)
{
// code that will be excuted when we
// click one menuButton (belongs to the DLL)
// How can i point back to the Exe project
// that is using this DLL !
}
}
我的问题是我将在多个其他项目(winforms)中使用此DLL,并且需要在每个项目中执行的代码将与其余项目不同,因此如何在winform项目中调用方法从DLL(不必更改DLL并重新编译每次我使用它)?
答案 0 :(得分:-1)
只是代表
您可以定义delegate,指定您要提供的参数
public delegate void MenuButtonClickCallbackDelegate(TypeOfData data);
public MenuButtonClickCallbackDelegate MenuButtonClickCallback;
然后在需要时调用它:
private void Radio_CheckedChanged(object sender, EventArgs e)
{
var selectedMenuButton = (RadioButton)sender;
if (selectedMenuButton.Checked)
{
if(MenuButtonClickCallback != null)
MenuButtonClickCallback(parameter);
}
}
这是你从exe中为MenuButtonClickCallback
分配函数的方法:
void MenuButtonClicked(TypeOfData data)
{
}
/*
.
.
.
*/
theObject.MenuButtonClickCallback = MenuButtonClicked;
<强>事件强>
或者您可以提供一个事件(如果可能会调用多个方法)。您必须将MenuButtonClickCallback
定义如下:
public event MenuButtonClickCallbackDelegate MenuButtonClickCallback;
方法的分配如下:
void MenuButtonClicked(TypeOfData data)
{
}
void MenuButtonClickedAnotherMethod(TypeOfData data)
{
}
/*
.
.
.
*/
theObject.MenuButtonClickCallback += MenuButtonClicked;
theObject.MenuButtonClickCallback += MenuButtonClickedAnotherMethod;