【问题标题】:Switch UI resources at Runtime在运行时切换 UI 资源
【发布时间】:2015-10-25 03:45:07
【问题描述】:

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

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

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

    • 为每个主题创建一个ImageList
    • 将每个ImageListTag 属性设置为主题名称。 (你不能在运行时通过名称访问组件,组件的名称属性仅用于设计时,因此设置Tag属性以通过标签访问它们)
    • ColorDepth 属性设置为 png 图像的 32 位和位图图像的 24 位
    • 为图像设置名称,并为不同图像列表中的相同图像使用相同的名称,例如,所有图像列表中添加按钮的图像使用“添加”名称。
    • 设置按钮的ImageList 属性,并在设计时设置ImageIndexImageKey 属性。首选使用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");
    

    它会将所有按钮的图像列表设置为具有Tag 属性值theme1ImageList

    【讨论】:

    • 不错的解决方案。不幸的是,就我而言,使用 imagelist 会使 alpha 混合的 png 图标看起来非常糟糕。我确实正确设置了图像列表,即 32x32 大小和 32 位颜色。有什么想法吗?
    • 找到这个:stackoverflow.com/questions/10372797/… 不幸的是,这将导致我失去对 VS Designer 的支持——我绝对想要的。对于我的场景,我决定硬编码基本主题,然后使用上述逻辑在运行时将不同的 png 图标组分配给按钮。
    • ImageSize: 如果您的原始图像是 16x16,您应该使用 16,16 代替 ImageSize,不要将其更改为 32,32。如果您需要 32x32 图像,请使用原始 16x16 图像,然后将 ImageSize 设置为 32,32。如果您将ImageSize 设置为与原始图像大小不同的值,则会导致图像质量非常差。
    • 图片大小正确。请参阅我的第二条评论,它解释了 ImageList 控件会导致质量下降,虽然该答案提出了一种解决方法,但该解决方案会导致失去 VS Designer 支持。
    • ColorDepth:您应该将ColorDepth 设置为Depth32Bit,然后添加您的图像。
    猜你喜欢
    • 2011-01-23
    • 2010-10-18
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多