簡體   English   中英

如何將自己的主題應用於我的Windows窗體應用程序?

[英]How can I apply my own theme to my Windows Forms application?

在C#中執行Windows窗體應用程序時, 窗體的視圖看起來與Windows的主題相同。

如何將自己的主題提供給不依賴於Windows主題的應用程序?

你不能輕易做到這一點。 您可以使用多種替代方案。

  1. 最簡單的方法是創建自己的Skin XML文件,在其中為應用程序指定自己的顏色,通過您創建的類讀取它並應用新顏色。 這將使事物分離並為將來的變化做好准備。 但請注意,您仍然無法更改標題欄的呈現方式以及其他特定於系統的內容,例如X和最大化按鈕的外觀。

  2. 擴展到第1點,您可以將表單創建為無邊框,並使用自定義繪制(覆蓋OnPaint)和圖像創建窗口。 這很難實現。 您可能希望從Form類繼承並創建自己的CustomDrawnForm,您將在整個應用程序中使用它。

  3. 使用眾多控件庫中的一個,例如DevExpress。 有些是免費的,有些是昂貴的。

你想要做的事情在Windows.Forms中並不是很簡單,也許你應該看看WPF和其他替代品。

覆蓋OnPaint方法並繪制您想要的任何內容。 :)

protected override void OnPaint(PaintEventArgs e)
{
    Graphics g = e.Graphics;

    SolidBrush brush = new SolidBrush(Color.Black);
    float percent = (float)(val - min) / (float)(max - min);
    Rectangle rect = this.ClientRectangle;

    rect.Width = (int)((float)rect.Width * percent);

    g.FillRectangle(brush, rect);

    brush.Dispose();
    g.Dispose();
}

這取決於你對主題的意圖; 漢斯在評論中說,通常使用系統的“主題”來控制和窗口外觀被視為一種資產。

但是,對於應用程序中的主題元素 - 例如標題面板的背景或標題字體顏色等,那么我將構建一個界面,其中包含應用程序中顏色/圖像的定義(例如ITheme ),然后只使用常規數據綁定進行配置在設置ITheme時,它們在運行時適當地適當。

public interface ITheme
{
    string Name { get; }
    Image Logo { get; }
    String BrandText1 { get; }
    String BrandText2 { get; }
    Image BrandBannerLogo { get; }
    Color BrandPanelText_Left { get; }
    Color BrandPanelText_Centre { get; }
}

實際上,您可以更進一步......例如,在我們的應用程序中,我們還定義了一個IThemeManager

public interface IThemeManager : INotifyPropertyChanged
{
    event EventHandler CurrentThemeChanged;
    ITheme CurrentTheme { get; set; }
    Dictionary<string, ITheme> AvailableThemes { get; }
}

我們允許ThemeManager被依賴注入,然后我們在控件中綁定它的Current屬性:

    [Dependency]
    public IThemeManager ThemeManager
    {
        get { return _themeManager; }
        set
        {
            if (_themeManager != value)
            {
                _themeManager = value;
                if (_themeManager != null && !DesignMode)
                {
                    _headerPanelBackgroundImageBinding = themePanel.DataBindings.Add("BackgroundImage", ThemeManager, "CuurentTheme.Logo", false, DataSourceUpdateMode.Never);
                }
                else
                {
                    // Reset to the default
                    this.DataBindings.Remove(_headerPanelBackgroundImageBinding);
                }

                Invalidate();
            }
        }
    }

我知道這個問題相當陳舊,但對於那些(像我一樣)仍然有興趣創建真正的“主題”Windows窗體,如上所述,WPF非常適合創建主題。 還有相當多的預先創建的主題(Google和stackoverflow始終是您的朋友)可供下載。 Windows Forms項目世界可能有一點學習曲線,但恕我直言也非常值得。 但是,如果您希望使用普通的Windows窗體應用程序(就像我一樣),最簡單的建議是創建無邊框窗體(將FormBorderStyle設置為None)。 這將保留大多數標准的Windows容器屬性。 當然,您需要創建自己的“主題”TitleBar和邊框,但這主要是Windows窗體的“主題”所在。 您還需要創建自己的大小調整和移動方法,但Google和stackoverflow再次成為您的朋友。 這個簡單的建議對某些人來說很明顯,對我來說是巨大的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM