我正在开发一个带有图标(图像)按钮的WinForms UI。目前,我只是使用中的image属性为每个按钮分配了图标图像。但是,我希望能够在运行时切换到不同的图标集/主题。我在堆栈溢出上看到的各种方法都是特定于运行时的,即代码加载相应的资源程序集,然后对每个按钮加载相应的映像资源并将其分配给按钮。有自动的方法吗?基本上,我希望避免编写加载每个资源并将其分配给特定按钮的部分。
发布于 2015-10-24 19:45:07
您可以使用多个ImageList来包含不同的主题图像,然后使用这些图像列表作为不同主题的按钮的图像源。为此:
ImageListTag的ImageList属性设置为主题名称。(不能在运行时按名称访问组件,组件的name属性仅用于设计时,因此将Tag属性设置为通过标记访问它们)ColorDepth属性设置为32位用于png图像,24位用于位图图像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属性的theme1。
https://stackoverflow.com/questions/33313886
复制相似问题