WPF實現顏色選擇器

来源:https://www.cnblogs.com/lvpp13/p/18065716
-Advertisement-
Play Games

先看效果圖; 再說一下思路: 打開設計器,屬性裡面找到"顏色",設置為漸變色,將漸變色設置為9段,分別是,紅橙黃綠青藍紫白黑(Red,Orange,Yellow,Lime,Cyan,Blue,Magenta,White,Black); 然後移動滑塊兒,比如在紅色和橙色和黃色之間移動的時候,會發現顏色 ...


先看效果圖;

 

再說一下思路:

 

打開設計器,屬性裡面找到"顏色",設置為漸變色,將漸變色設置為9段,分別是,紅橙黃綠青藍紫白黑(Red,Orange,Yellow,Lime,Cyan,Blue,Magenta,White,Black);

然後移動滑塊兒,比如在紅色和橙色和黃色之間移動的時候,會發現顏色的RGB值是有規律的變化的,R是固定的255,G是從0開始慢慢增加到255,B是固定的0;

在黃色和綠色之間變化的時候,R是從255開始減少,G是固定255,B還是固定的0;

所以總結出以下規律:

//when index<=2        R=255;    G=up;    B=0;
//when 2<index<=3      R=down;   G=255;   B=0;
//when 3<index<=4      R=0;      G=255;   B=up;
//when 4<index<=5      R=0;      G=down;  B=255;
//when 5<index<=6      R=up;     G=0;     B=255;
//when 6<index<=7      R=255;    G=up;    B=255;
//when 7<index<=8      R=down;   G=down;  B=down;

index表示 紅橙黃綠青藍紫白黑 的順序;up表示遞增,down表示遞減;

開始創建自定義控制項:

右鍵項目,新增用戶控制項ColorSlider,新增後,添加以下代碼:

<UserControl.Template>
        <ControlTemplate TargetType="{x:Type UserControl}">
            <Slider Maximum="8" Minimum="0" Width="{TemplateBinding Width}" SmallChange="0.1" LargeChange="0.1"
                    ValueChanged="CornerSlider_ValueChanged">
                <Slider.Background>
                    <LinearGradientBrush>
                        <GradientStop Color="Red"/>
                        <GradientStop Color="Orange" Offset="0.125"/>
                        <GradientStop Color="Yellow" Offset="0.25"/>
                        <GradientStop Color="Lime" Offset="0.375"/>
                        <GradientStop Color="Cyan" Offset="0.5"/>
                        <GradientStop Color="Blue" Offset="0.625"/>
                        <GradientStop Color="Magenta" Offset="0.75"/>
                        <GradientStop Color="White" Offset="0.875"/>
                        <GradientStop Color="Black" Offset="1"/>
                    </LinearGradientBrush>
                </Slider.Background>
            </Slider>
        </ControlTemplate>
    </UserControl.Template>

裡面的offset是因為,設置了slider的最大值是8,最小值是0,紅橙黃綠青藍紫白黑 8個顏色平均分配1的話,間隔就應該是0.125;

後臺代碼如下:

public partial class ColorSlider : UserControl
    {
        public static readonly DependencyProperty SelectedColorProperty;

        public Brush SelectedColor
        {
            get { return (Brush)GetValue(SelectedColorProperty); }
            set { SetValue(SelectedColorProperty, value); }
        }

        public ColorSlider()
        {
            InitializeComponent();
        }

        static ColorSlider()
        {
            SelectedColorProperty = DependencyProperty.Register("SelectedColor", typeof(Brush), typeof(ColorSlider)
                ,new PropertyMetadata(new SolidColorBrush(Color.FromRgb(255, 0, 0))));
        }

        private void CornerSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            var sd = sender as CornerSlider;
            var value = Math.Round(sd.Value, 2);
            var factor = value - Math.Floor(value);
            //when index<=2        R=255;    G=up;    B=0;
            //when 2<index<=3      R=down;   G=255;   B=0;
            //when 3<index<=4      R=0;      G=255;   B=up;
            //when 4<index<=5      R=0;      G=down;  B=255;
            //when 5<index<=6      R=up;     G=0;     B=255;
            //when 6<index<=7      R=255;    G=up;    B=255;
            //when 7<index<=8      R=down;   G=down;  B=down;
            if (value <= 2)
            {
                var g = (byte)(255 * (value / 2));
                SelectedColor = new SolidColorBrush(Color.FromRgb(255, g, 0));
            }
            else if (value > 2 && value <= 3)
            {
                var r = (byte)(255 - 255 * factor);
                SelectedColor = new SolidColorBrush(Color.FromRgb(r, 255, 0));
            }
            else if (value > 3 && value <= 4)
            {
                var b = (byte)(255 * factor);
                SelectedColor = new SolidColorBrush(Color.FromRgb(0, 255, b));
            }
            else if (value > 4 && value <= 5)
            {
                var g = (byte)(255 - 255 * factor);
                SelectedColor = new SolidColorBrush(Color.FromRgb(0, g, 255));
            }
            else if (value > 5 && value <= 6)
            {
                var r = (byte)(255 * factor);
                SelectedColor = new SolidColorBrush(Color.FromRgb(r, 0, 255));
            }
            else if (value > 6 && value <= 7)
            {
                var g = (byte)(255 * factor);
                SelectedColor = new SolidColorBrush(Color.FromRgb(255, g, 255));
            }
            else
            {
                var c = (byte)(255 - 255 * factor);
                SelectedColor = new SolidColorBrush(Color.FromRgb(c, c, c));
            }
        }
    }

實際效果圖可能會和原圖有出入,是因為我是用自己寫的一個CornerSlider控制項代替了Slider;

最後就可以通過SelectedColor來獲取所選顏色了;

項目github地址是:https://github.com/bearhanQ/WPFFrameWork

QQ群可以隨時討論:332035933;


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在這篇全面解析CDN的技術文章中,我們深入探討了CDN的基礎概念、核心架構、多樣化產品和在不同行業中的應用案例。文章揭示了CDN技術如何優化內容分發,提升用戶體驗,並展望了CDN面臨的挑戰和未來發展趨勢。 關註【TechLeadCloud】,分享互聯網架構、雲服務技術的全維度知識。作者擁有10+年互 ...
  • 寫在前面 在Java日常開發過程中,實現Excel文件的導入導出功能是一項常見的需求。 通過使用相關的Java庫,如Apache POI、EasyPoi或EasyExcel,可以輕鬆地實現Excel文件的讀寫操作。 而這篇文章將介紹如何在Java中使用Apache POI、EasyPoi 和Easy ...
  • 學了分塊,感覺這玩意好難啊,怎麼聽起來這麼簡單?【】【】分塊! 先推薦一個東西:loj 分塊全家桶! 首先,把一整個數組劈成 \(\sqrt n\) 塊是最優的!(當然如果你想寫一個 \(114514\) 塊的分塊也沒問題但他不優啊!) 長這樣: 這樣它的複雜度是: 預處理:\(O(n\sqrt n ...
  • 前言:配合狂神老師的教學視頻使用效果更佳: https://www.bilibili.com/video/BV1NE411Q7Nx/?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click&vd_source ...
  • 大家好,我是你們的老伙計秀才!今天帶來的是[深入淺出Java多線程]系列的第十篇內容:CAS。大家覺得有用請點贊,喜歡請關註!秀才在此謝過大家了!!! ...
  • 在Word中,表格是一個強大的工具,它可以幫助你更好地組織、呈現和分析信息。本文將介紹如何使用Python在Word中創建表格並填入數據、圖片,以及設置表格樣式等。 Python Word庫: 要使用Python在Word中創建或操作表格,需要先將Spire.Doc for Python這個第三方庫 ...
  • 在 Java 的java.util.concurrent包中,除了提供底層鎖、併發同步等工具類以外,還提供了一組原子操作類,大多以Atomic開頭,他們位於java.util.concurrent.atomic包下。 ...
  • 本文將從leader處理器入手,詳細分析node的增刪改查流程及監聽器原理。 回顧數據讀寫流程 leader ZookeeperServer.processPacket封裝Request並提交給業務處理器 LeaderRequestProcessor做本地事務升級 PrepRequestProces ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...