C# 为一组控件设置公共属性
我在一个函数中,该函数在表单中重新绘制某些控件,它是作为ControlCollection类的扩展方法实现的,如下所示:C# 为一组控件设置公共属性,c#,reusability,C#,Reusability,我在一个函数中,该函数在表单中重新绘制某些控件,它是作为ControlCollection类的扩展方法实现的,如下所示: void SetColorsCorrespondingToVisualStudioTheme(this Control.ControlCollection controls) { foreach (var control in controls) { ... 在该方法中,设置一组控件所共有的一些GUI属性的代码: ... if (controlTyp
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更糟糕。
我是否缺少您可能知道的解决此问题的另一种方法?我可能会创建一个结构以保留属性的所需值,以及一个方法,该方法接受类型为Control的参数并对其应用样式:
if (control is TreeView || control is TextBox)
{
((Control)control).BorderStyle = BorderStyle.None;
((Control)control).BackColor = EditorBackgroundColor;
((Control)control).ForeColor = FontColor;
}
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方法。您可以将
控件
强制转换为动态
,并设置您想要的任何属性,只要这些属性在运行时存在。例:((动态)控制)。Whatever=某物代码>。这两个类都是从控件类继承的属性。因此,您可以简单地强制转换为(控件)。但我相信BorderStyle不属于控件类。@Saragis确实,BorderStyle不属于控件类,这就是为什么我需要将控件强制转换为更特定的类型。@Ron Beyer您的解决方案正是我所寻找的!谢谢这是对if子句的一个改进,但我还想重用if语句的内容。现在试试吧,我不太习惯这个API,所以我不确定,只是尝试了它们共享的一个基类。另外,我可以看看你是如何声明控件的吗?我已经包括了刚才声明“控件”的代码,它位于ControlCollection的foreach语句中。虽然BorderStyle不是控件类的一部分,但您的解决方案使我朝着正确的方向前进了一步,因为我使用了许多其他控件的BackColor和ForeColor属性。虽然这似乎是一个很好的建议,可以对共享公共属性的控件进行分组和排序,问题仍然是当这些控件中的某些控件不是直接从控件类派生(如BorderStyle)时设置这些属性,我可能会将您的方法与@Ron Beyer提出的建议(使用动态类型)结合起来,以获得一个完整的解决方案。谢谢这个答案的要点是将属性赋值从循环中移到单个方法中。不管怎样,很高兴能帮上忙。。。