我在一个重新绘制表单内某些控件的函数内部,它实现为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更糟糕。 我错过了解决这个问题的另一种方法吗?
答案 0 :(得分:1)
if (control is TreeView || control is TextBox)
{
((Control)control).BorderStyle = BorderStyle.None;
((Control)control).BackColor = EditorBackgroundColor;
((Control)control).ForeColor = FontColor;
}
答案 1 :(得分:1)
我可能会创建一个结构来保持属性的所需值,以及一个采用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方法。