首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在运行时切换UI资源

在运行时切换UI资源
EN

Stack Overflow用户
提问于 2015-10-24 02:23:10
回答 1查看 116关注 0票数 0

我正在开发一个带有图标(图像)按钮的WinForms UI。目前,我只是使用中的image属性为每个按钮分配了图标图像。但是,我希望能够在运行时切换到不同的图标集/主题。我在堆栈溢出上看到的各种方法都是特定于运行时的,即代码加载相应的资源程序集,然后对每个按钮加载相应的映像资源并将其分配给按钮。有自动的方法吗?基本上,我希望避免编写加载每个资源并将其分配给特定按钮的部分。

EN

Stack Overflow用户

回答已采纳

发布于 2015-10-24 19:45:07

您可以使用多个ImageList来包含不同的主题图像,然后使用这些图像列表作为不同主题的按钮的图像源。为此:

  • 为每个主题创建一个ImageList
  • 将每个TagImageList属性设置为主题名称。(不能在运行时按名称访问组件,组件的name属性仅用于设计时,因此将Tag属性设置为通过标记访问它们)
  • ColorDepth属性设置为32位用于png图像,24位用于位图图像
  • 为图像设置名称,并在不同的图像列表中使用相同的名称,例如,对于所有图像列表中的“图像添加”按钮,使用“添加”名称。
  • 设置按钮的ImageList属性,并在设计时设置ImageIndexImageKey属性。使用ImageKey属性是首选的,因为如果ImageList中缺少密钥,它将不显示按钮的图像。
  • 在运行时更改ImageList属性以获取按钮的不同图像。

例如,可以使用此代码在运行时更改所有按钮的ImageList

代码语言:javascript
复制
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();
        });
}

下面是用法:

代码语言:javascript
复制
this.ChangeTheme("theme1");

它将将所有按钮的图像列表设置为具有值为ImageListTag属性的theme1

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33313886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档