我编写了一个用户控件MenuItem,它继承自Form Label。
我有一个backgroundworker线程,其IsBusy属性通过MainForm中的属性公开为IsBackgroundBusy。
如何从MenuItem usercontrol中读取此属性?我目前正在使用Application.UseWaitCursor,我在backgroundworker中设置它并且它完美地工作,但是我不希望光标改变。这就是为什么我想出一个我可以设置的房产会好得多。
以下是我的MainForm中的代码:
public partial class MainForm : Form
{
public bool IsBackgroundBusy
{
get
{
return bwRefreshGalleries.IsBusy;
}
}
以下是我的usercontrol的代码:
public partial class MenuItem: Label
{
private bool _disableIfBusy = false;
[Description("Change color if Application.UseWaitCursor is True")]
public bool DisableIfBusy
{
get
{
return _disableIfBusy;
}
set
{
_disableIfBusy = value;
}
}
public MenuItem()
{
InitializeComponent();
}
protected override void OnMouseEnter( EventArgs e )
{
if ( Application.UseWaitCursor && _disableIfBusy )
{
this.BackColor = SystemColors.ControlDark;
}
else
{
this.BackColor = SystemColors.Control;
}
base.OnMouseEnter( e );
}
答案 0 :(得分:1)
(注意:我不清楚你这里是否有实际UserControl
。你展示的MenuItem
课程继承Label
,而不是UserControl
当你实际上没有处理UserControl
对象时,你应该避免使用术语" usercontrol"或"用户控件"
如果没有完整的代码示例,很难确切知道这里的解决方案是什么。但是,假设您以典型方式使用BackgroundWorker
,那么您只需要控件的所有者(即包含Form
)在控件发生更改时将必要的状态传递给控件。 E.g:
class MenuItem : Label
{
public bool IsParentBusy { get; set; }
}
// I.e. some method where you are handling the BackgroundWorker
void button1_Click(object sender, EventArgs e)
{
// ...some other initialization...
bwRefreshGalleries.RunWorkerCompleted += (sender1, e1) =>
{
menuItem1.IsParentBusy = false;
};
menuItem1.ParentIsBusy = true;
bwRefreshGalleries.RunAsync();
}
如果您已经拥有RunWorkerCompleted
事件的处理程序,那么只需将该语句设置为IsParentBusy
属性,而不是添加另一个处理程序。
然后,您可以只查看Application.UseWaitCursor
属性,而不是使用IsParentBusy
属性。
您可以使用其他机制;我同意一般的观点,即MenuItem
控件不应该与您的特定Form
子类绑定。如果出于某种原因上述情况不适用于您的情况,您需要详细说明您的问题:提供一个好的代码示例并解释为什么简单地让控件的容器直接管理其状态并不起作用为你