为集合控件设置公共属性
本文关键字:属性 设置 集合 控件 | 更新日期: 2023-09-27 18:01:18
我在一个函数中,重绘表单中的某些控件,它是作为ControlCollection类的扩展方法实现的,如下所示:
void SetColorsCorrespondingToVisualStudioTheme(this Control.ControlCollection controls)
{
foreach (var control in controls)
{
...
在此方法中,设置一组控件的一些通用GUI属性的代码:
...
if (controlType == typeof(TreeView))
{
((TreeView)control).BorderStyle = BorderStyle.None;
((TreeView)control).BackColor = EditorBackgroundColor;
((TreeView)control).ForeColor = FontColor;
continue;
}
if (controlType == typeof(TextBox))
{
((TextBox)control).BorderStyle = BorderStyle.None;
((TextBox)control).BackColor = EditorBackgroundColor;
((TextBox)control).ForeColor = FontColor;
}
...
我想知道是否有一种方法重构代码以便重用,如:
if (controlType == typeof(TreeView) || controlType == typeof(TextBox))
{
((controlType)control).BorderStyle = BorderStyle.None;
((controlType)control).BackColor = EditorBackgroundColor;
((controlType)control).ForeColor = FontColor;
}
上面的代码显然不起作用,因为controlType是一个变量而不是类型,但我想做的事情的意图是重要的。我也试过:
((typeof(controlType))control).B...
我现在能想到的唯一选择是为基本类型(TreeView, TextBox等)创建自定义控件,并使所有这些控件实现一个公共接口,以便我可以互换使用它们:
...
if (controlType == typeof(TreeView) || controlType == typeof(TextBox))
{
//CustomControl() ñ
ICustomControl newControl = new CustomControl(control);
newControl.BorderStyle = BorderStyle.None;
newControl.BackColor = EditorBackgroundColor;
newControl.ForeColor = FontColor;
}
...
public class CustomTreeView : ICustomControl
{
...
public class CustomTextBox : ICustomControl
{
...
public interface ICustomControl
{
public BorderStyle BorderStyle {get; set;}
public Color BackColor {get; set;}
public Color ForeColor {get; set;}
...
,但这(至少在我的脑海中)听起来比保留多个if更糟糕。我是不是漏掉了另一种解决这个问题的方法?
if (control is TreeView || control is TextBox)
{
((Control)control).BorderStyle = BorderStyle.None;
((Control)control).BackColor = EditorBackgroundColor;
((Control)control).ForeColor = FontColor;
}
我可能会创建一个结构体来保存所需的属性值,以及一个方法,该方法接受类型为Control的参数并对其应用样式:
struct ThemeStyle
{
ThemeStyle(Color backColor, Color foreColor, BorderStyle borderStyle)
{
this.BackColor = backColor;
this.ForeColor = foreColor;
this.BorderStyle = borderStyle;
}
public Color BackColor {get; private set;}
public Color ForeColor {get; private set;}
public BorderStyle BorderStyle {get; private set;}
public void Apply(Control c)
{
c.BackColor = this.BackColor;
switch(typeof(c))
{
case typeof(TreeView):
case typeof(TextBox):
c.BorderStyle = this.BorderStyle;
break;
}
}
}
注意:这段代码只是一个演示,在这里直接使用手机编写。可能有一些错误。
然后在你的循环中,你所需要做的就是调用控件的Apply方法