如何从用户控件中的主窗体读取属性
How do I read a property from my main form in a user control
我编写了一个用户控件 MenuItem,它继承自 Form Label。
我有一个后台工作线程,其 IsBusy 属性通过 MainForm 中的一个属性公开为 IsBackgroundBusy。
如何从 MenuItem 用户控件中读取此属性?我目前正在使用 Application.UseWaitCursor 并且我在 backgroundworker 中设置了它并且它工作得很好,但是我不希望光标改变。这就是为什么我认为我可以设置的属性会更好。
这是我的 MainForm 中的代码:
public partial class MainForm : Form
{
public bool IsBackgroundBusy
{
get
{
return bwRefreshGalleries.IsBusy;
}
}
这是我的用户控件的代码:
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 );
}
(注意:我不清楚这里是否有实际的 UserControl
。您显示的 MenuItem
class 继承 Label
,而不是 UserControl
。当你实际处理的不是 UserControl
对象时,你应该避免使用术语 "usercontrol" 或 "user control"。
没有完整的代码示例,很难确切知道正确的解决方案是什么。但是,假设您以典型方式使用 BackgroundWorker
,那么您只需要控件的所有者(即包含 Form
)在控件更改时将必要的状态传递给控件。例如:
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
子 class 绑定。如果由于某种原因以上不适用于您的情况,您需要详细说明您的问题:提供一个很好的代码示例并准确解释为什么让控件的容器直接管理其状态对您不起作用
我编写了一个用户控件 MenuItem,它继承自 Form Label。
我有一个后台工作线程,其 IsBusy 属性通过 MainForm 中的一个属性公开为 IsBackgroundBusy。
如何从 MenuItem 用户控件中读取此属性?我目前正在使用 Application.UseWaitCursor 并且我在 backgroundworker 中设置了它并且它工作得很好,但是我不希望光标改变。这就是为什么我认为我可以设置的属性会更好。
这是我的 MainForm 中的代码:
public partial class MainForm : Form
{
public bool IsBackgroundBusy
{
get
{
return bwRefreshGalleries.IsBusy;
}
}
这是我的用户控件的代码:
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 );
}
(注意:我不清楚这里是否有实际的 UserControl
。您显示的 MenuItem
class 继承 Label
,而不是 UserControl
。当你实际处理的不是 UserControl
对象时,你应该避免使用术语 "usercontrol" 或 "user control"。
没有完整的代码示例,很难确切知道正确的解决方案是什么。但是,假设您以典型方式使用 BackgroundWorker
,那么您只需要控件的所有者(即包含 Form
)在控件更改时将必要的状态传递给控件。例如:
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
子 class 绑定。如果由于某种原因以上不适用于您的情况,您需要详细说明您的问题:提供一个很好的代码示例并准确解释为什么让控件的容器直接管理其状态对您不起作用