C# 如何使用系统反射设置基础设施组件的背景色
我有一个应用程序,它使用Windows.Form和GUI/UI的基础设施。我想将背景色、前景色等属性的分配从我的主要项目中分离出来,使其更易于阅读和缩小。因此,我在VS(2017,Professional)中创建了一个新项目,我使用反射设置所有属性,因为我希望避免在GUI项目中引用我的主项目 我得到了想要更改的控制元素,如下所示:C# 如何使用系统反射设置基础设施组件的背景色,c#,winforms,infragistics,system.reflection,C#,Winforms,Infragistics,System.reflection,我有一个应用程序,它使用Windows.Form和GUI/UI的基础设施。我想将背景色、前景色等属性的分配从我的主要项目中分离出来,使其更易于阅读和缩小。因此,我在VS(2017,Professional)中创建了一个新项目,我使用反射设置所有属性,因为我希望避免在GUI项目中引用我的主项目 我得到了想要更改的控制元素,如下所示: object controlsCollectionObject = currentObject.GetType().GetProperty("Controls").G
object controlsCollectionObject = currentObject.GetType().GetProperty("Controls").GetValue(currentObject);
ArrayList controlsInnerList = controlsCollectionObject.GetType().GetProperty("InnerList", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(controlsCollectionObject) as ArrayList;
private static void SetControlProperties()
{
Tuple<object,PropertyInfo> objectReferenceAndBackColor;
DataRow dbPanels;
for (int i = 0; i < panelsData.Length; i++)
{
dbPanels = panelsData[i];
if(controlElements.TryGetValue(dbPanels["ButtonText"].ToString(), out objectReferenceAndBackColor))
{
objectReferenceAndBackColor.Item2.SetValue(objectReferenceAndBackColor.Item1, Color.FromName(dbPanels["BackColor1"].ToString()));
Debug.WriteLine(objectReferenceAndBackColor.Item2.GetValue(objectReferenceAndBackColor.Item1).ToString() + " I am Object of: " + objectReferenceAndBackColor.Item1.ToString());
}
}
}
此内部列表包含该ControlCollection对象的控件元素。
然后,我迭代此列表并查找要设置的两个属性:
Type listItemType = listItem.GetType();
if (wantedControls.Contains(listItem.GetType().Name))
{
listItemName.Append(listItemType.GetProperty("Name").GetValue(listItem) as string);
if (!controlElements.ContainsKey(listItemName.ToString()))
{
controlElements.Add(listItemName.ToString(), new Tuple<object, PropertyInfo>(listItem, listItemType.GetProperty("BackColor")));
}
if (listItemType.GetProperty("Appearance") != null)
{
appearanceObject = listItemType.GetProperty("Appearance").GetValue(listItem);
listItemName.Append("_Appearance");
controlElements.Add(listItemName.ToString(), new Tuple<object, PropertyInfo>(appearanceObject, appearanceObject.GetType().GetProperty("BackColor")));
}
if (!doNotPushInStack.Contains(listItem.GetType().Name))
{
objectsToIterate.Push(listItem);
}
listItemName.Clear();
}
panelsData
是一个DataRow
,它包含我要写入属性的所有值。所有值都保存在本地SQL数据库中。
我检查[“ButtonText”]
的原因是因为我临时将控件的数据集写入了我的“Button”数据表
对于大多数组件,如面板,它工作正常,但一些基础设施组件,如UltraTextEditor,它不工作。它似乎没有从反射中注册或接收我通过SetValue()设置的更改
完成后,当我在主项目中检查是否已设置值时,我看到某些组件未保存这些值:
Color[Transparent]我是以下对象:Infragistics.Win.UltraWinEditors.UltraTextEditor
相反,它在日志中应该如下所示:
Color[255;11;110;143]我是以下对象:Infragistics.Win.UltraWinGrid.UltraGrid
我尝试设置的值不是只读的。UltraTextEditor.UseAppStyleing
以及UseOsThemes
属性设置为false。我还检查了我的值是否在某个点被覆盖,但事实并非如此。我在我的主项目中使用了我在这里展示的相同方法来查看这是否是一个权限问题,但这也不起作用。
我可以简单地使用ultryTextEditorTest.backcolor=Color.Blue,在我的主项目中设置这些组件的背景色代码>很好,但通过反射它不会将其写入属性。我已经检查了我的数据库中的值和代码中的sql查询,看看我是否犯了错误,但一切都是正确的,所以现在我不确定是什么问题,或者至少不知道为什么不让我通过反射设置背景色
我知道我可以简单地正常设置颜色,但在这一点上,我很固执,想知道为什么它不起作用,或者它可能不可能这样做,因为Infrastic禁止我这样做。也就是说,如果基础设施是问题,或者如果我在代码中犯了一个我看不到的错误
我希望这不是太多的一次,如果它是让我知道,我会尝试打破它多一点,以便更容易阅读和理解
提前谢谢你的帮助 你有没有看到有人在UltraTextEditor上有类似的问题,尽管没有涉及反射@我确实看到了这篇文章,但我认为它并没有解决我的问题。我注意到,当我聚焦UltraTextEditor时,它会因为创建的文本框而更改其颜色,但当我设置UltraTextEditor的外观属性的背景色时,它会覆盖此文本框的颜色,并永久显示指定的颜色,无论是否聚焦。所以我想,如果我通过反射设置外观。背景色,它应该做同样的事情,但事实并非如此。你是否尝试设置UseOsThemes属性?是的,我尝试了两种方法,但结果是一样的。UltraTextEditor的背景色保留其默认颜色,该颜色在infragistics的InitializeComponent()方法内设置。