1. 程式人生 > >[WinForm]IrisSkin面板的基本使用以及單獨控制元件樣式設定

[WinForm]IrisSkin面板的基本使用以及單獨控制元件樣式設定

介紹

IrisSkin 是為Microsoft Visual  Studio dotNET開發的最易用的介面增強dotNET(WinForm)元件包。它能完全自動的為您的應用程式新增支援換膚功能,甚至不需要更改您的設計好的Form以及新增一行程式碼!您也不再需要花費很多時間來使得自己的應用程式更漂亮。

IrisSkin提供一個強大的元件SkinEngine元件來幫助您完成這一切所有的工作。您需要做的,只是將一個SkinEngine元件拖放到您設計的主Form上,並且設定一些屬性,然後所有的Form以及對話方塊,都會自動的在執行時支援換膚功能。您也可以輕易的讓應用程式回覆到原始Windows風格。

使用

1.在WinForm中新增資原始檔後,將喜歡的面板拖放至裡面,如圖:

image

後臺程式碼:

        public static SkinEngine AppSkin { get; set; }
        #endregion
        #region 建構函式
        public frmMain()
        {
            InitializeComponent();
        }
        private void frmMain_Load(object sender, EventArgs e)
        {
            InitBasic();
            InitCom();
            SetSkinFile(skin, LHResource.Page);
        }
        private
void SetSkinFile(SkinEngine skin, byte[] bytes) { using (MemoryStream memoryStream = new MemoryStream(bytes)) { skin.SkinStream = memoryStream; AppSkin = skin; } } #endregion
執行效果如圖

image

2.若想設定某個控制元件的背景顏色,會發現無法修改的的情況,這時候需要設定需要修改控制元件的tag屬性即可,下面以修改Button控制元件為例:

        Bitmap btnbmp = null;
        /// <summary>
        /// 修改button控制元件的背景顏色
        /// </summary>
        /// <param name="button"></param>
        private void ChangButtonColor(Button button)
        {
            if (btnbmp == null)
            {
                btnbmp = new Bitmap(button.Width, button.Height);
                using (Graphics g = Graphics.FromImage(btnbmp))
                {
                    Rectangle r = new Rectangle(0, 0, btnbmp.Width, btnbmp.Height);
                    using (LinearGradientBrush br = new LinearGradientBrush(
                                                        r,
                                                        Color.Red,
                                                        Color.DarkRed,
                                                        LinearGradientMode.Vertical))
                    {
                        g.FillRectangle(br, r);
                    }
                }
            }

            CrossThreadOperate.InvokeControlAction<Button>(button, delegate(Button btn)
            {
                btn.ForeColor = Color.White;
                btn.BackgroundImage = btnbmp;
                btn.Tag = frmMain.AppSkin.DisableTag;
            });

        }
        /// <summary>
        /// 還原button控制元件背景顏色
        /// </summary>
        /// <param name="button"></param>
        public void ReturnToBtnColor(Button button)
        {
            CrossThreadOperate.InvokeControlAction<Button>(button, delegate(Button btn)
            {
                btn.UseVisualStyleBackColor = true;
                btn.Tag = null;
            });
        }
        private void SetButtonBackColor<T>(T t, Button button) where T : Control
        {
            foreach (Control ctrl in t.Controls)
            {
                if (ctrl is Button)
                {
                    Button btnTemp = (Button)ctrl;
                    if (btnTemp.Name == button.Name)
                        ChangButtonColor(button);
                    else
                        ReturnToBtnColor(btnTemp);
                }
            }
        }

使用程式碼

        private void btnFInitPLC_Click(object sender, EventArgs e)
        {
            SetButtonBackColor<GroupBox>(gpFunction, btnFInitPLC);
            SetTabPageVisible(tbcMain, tpInitPLC);
        }

實現效果

image

image

相關程式碼:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
public class CrossThreadOperate
{

    public static void InvokeControlAction<t>(t cont, Action<t> action) where t : Control
    {
        if (cont.InvokeRequired)
        {
            cont.Invoke(new Action<t, Action<t>>(InvokeControlAction), new object[] { cont, action });
        }
        else
        {
            action(cont);
        }
    }
}

參考資料