我正在使用带有图标(图像)按钮的WinForms UI。目前,我刚刚使用Visual Studio设计器中的Image属性为每个按钮分配了图标图像。但是,我希望能够在运行时切换到不同的图标集/主题。我在stackoverflow上看到的各种方法仅适用于运行时,即代码加载相应的资源程序集,然后为每个按钮加载相应的图像资源并将其分配给按钮。这样做有自动方式吗?基本上,我想避免编写我加载每个资源的部分并将其分配给特定按钮。
答案 0 :(得分:1)
您可以使用多个ImageList
来包含不同的主题图片,然后将这些图片列表用作不同主题的按钮的图像源。为此:
ImageList
Tag
的{{1}}属性设置为主题名称。 (您无法在运行时按名称访问组件,组件的name属性仅用于设计时,因此请设置ImageList
属性以通过标记访问它们)Tag
属性设置为32位,将位图图像设置为24位ColorDepth
属性,并在设计时设置ImageList
或ImageIndex
属性。首选使用ImageKey
属性,因为如果ImageKey
中没有该密钥,则它不会显示该按钮的图像。ImageList
属性,以获取按钮的不同图像。例如,您可以使用此代码在运行时更改所有按钮的ImageList
:
ImageList
以下是用法:
private IEnumerable<Control> GetAllControls(Control control)
{
var controls = control.Controls.Cast<Control>();
return controls.SelectMany(ctrl => GetAllControls(ctrl)).Concat(controls);
}
private void ChangeTheme(string themeName)
{
GetAllControls(this).OfType<Button>().ToList()
.ForEach(btn =>
{
btn.ImageList = this.components.Components
.OfType<ImageList>()
.Where(x => Convert.ToString(x.Tag).ToLower() == themeName.ToLower())
.FirstOrDefault();
});
}
它会将所有按钮的图片列表设置为this.ChangeTheme("theme1");
,其ImageList
属性值为Tag
。