乾!垃圾微軟!發佈我的Netcore跨平臺UI框架 CPF

来源:https://www.cnblogs.com/dskin/archive/2020/07/05/13192489.html
-Advertisement-
Play Games

什麼鬼,我的CPF快寫好了,你居然也要搞跨平臺UI框架?什麼Maui? 之前怎麼不早說要搞跨平臺UI框架呢?看到谷歌搞flutter眼紅了?明年年底發佈?又搞這種追別人屁股的爛事情。 什麼MVU模式?模仿Dart?用C#代碼直接寫UI的模式和我的CPF很像啊。 當初我考慮過XML,Json來描述UI ...


什麼鬼,我的CPF快寫好了,你居然也要搞跨平臺UI框架?什麼Maui? 之前怎麼不早說要搞跨平臺UI框架呢?看到谷歌搞flutter眼紅了?明年年底發佈?又搞這種追別人屁股的爛事情。

什麼MVU模式?模仿Dart?用C#代碼直接寫UI的模式和我的CPF很像啊。

當初我考慮過XML,Json來描述UI,但是我感覺這些都是多餘的累贅,而且還需要學習語法,感覺Xaml很啰嗦,如果有設計器的話,直接生成對應的UI代碼不是更直接?而且用XML、Json需要多消耗解析UI代碼的資源。

所以一開始我是模仿Winform直接用C#來描述的,不過Winform生成的代碼很冗長,直接看這種代碼很費勁,所以考慮優化代碼結構,看看能否有既可以直接運行生成UI,既可以直觀描述結構的

 

 1                             new Panel
 2                             {
 3                                 ToolTip="最大化",
 4                                 Name="max",
 5                                 Width = 30,
 6                                 Height = "100%",
 7                                 Children=
 8                                 {
 9                                     new Rectangle
10                                     {
11                                         Width=14,
12                                         Height=12,
13                                         StrokeStyle="2",
14                                         StrokeFill = "#fff"
15                                     }
16                                 },
17                                 Commands =
18                                 {
19                                     {
20                                         nameof(Button.MouseDown),//可以綁定事件和屬性通知
21                                         (s,e)=>
22                                         {
23                                             (e as MouseButtonEventArgs).Handled = true;
24                                             this.WindowState= WindowState.Maximized;
25                                         }
26                                     }
27                                 },
28                                 Bindings = //數據綁定
29                                 {
30                                     {
31                                         nameof(Border.Visibility),
32                                         nameof(Window.WindowState),
33                                         this,
34                                         BindingMode.OneWay,//直接使用Lambda表達式作為數據轉換器
35                                         a => (WindowState)a == WindowState.Maximized ? Visibility.Collapsed : Visibility.Visible
36                                     }
37                                 },
38                                 Triggers=
39                                 {
40                                     new Trigger(nameof(Panel.IsMouseOver), Relation.Me)//觸發器可以設置相對位置的其他元素的屬性
41                                     {
42                                         Setters =
43                                         {
44                                             {
45                                                 nameof(Panel.Background),
46                                                 "#fff"
47                                             }
48                                         }
49                                     }
50                                 },
51                             }

 

這種結構感覺還行吧,微軟的Maui的Mvu模式,感覺和我的很像,而且mvu的最終格式還沒確定。現在maui那邊定義的規則似乎是以方法為主,而我的是以屬性為主,稍微封裝幾個擴展方法也可以變成maui那樣的。

另外Mvu模式似乎不提供拖拽的設計器,只提供預覽而已。

 

CPF的不僅可以預覽,還可以拖拽,設置屬性,生成C#代碼。支持SVG顯示。

 

 

CPF不提供Xaml描述UI,另外CPF提供CSS來描述樣式,類似於Unity3D里的USS。

為什麼使用CSS來描述?因為CSS結構簡單,簡潔明瞭,方便對多個元素聲明屬性,也方便代碼復用。比Xaml里的樣式描述簡潔多了。學習成本低,主要會幾個常用的選擇器就行

 

* {
    FontFamily: 微軟雅黑; 
}

@keyframes buttonAnimationEnter {
    0% {
        Background: #1E9FFF;
    }

    100% {
        Background: rgb(75,178,255);
    }
}

#DropDownPanel TextBlock {
    MarginLeft: 5;
}

Button {
    Background: #1E9FFF;
    Foreground: #fff;
    BorderFill: null;
}

    Button[IsMouseOver=true] {
        Background: #1E9FFF;
        animation-name: buttonAnimationEnter;
        animation-duration: 0.2s;
        animation-iteration-count: 1;
        animation-fill-mode: forwards;
    }

    Button[IsPressed=true] {
        Background: rgb(30,159,255);
    }

CheckBox #indeterminateMark {
    Fill: #1E9FFF;
}

CheckBox #checkBoxBorder {
    Background: #fff;
    BorderFill: #1E9FFF;
}

CheckBox[IsChecked=true] #checkBoxBorder {
    Background: #1E9FFF;
    BorderFill: #1E9FFF;
}

CheckBox Polyline {
    StrokeFill: #fff;
}

 

簡化依賴屬性寫法

        /// <summary>
        /// 前景色
        /// </summary>
        [UIPropertyMetadata(typeof(ViewFill), "Black", UIPropertyOptions.AffectsRender)]
        public ViewFill Foreground
        {
            get { return (ViewFill)GetValue(); }
            set { SetValue(value); }
        }

簡化附加屬性寫法

        /// <summary>
        /// 獲取或設置一個值,該值指示一個子元素在父級 DockPanel 中的位置。 附加屬性
        /// </summary>
        public static Attached<Dock> Dock
        {
            get
            {
                return RegisterAttached(Controls.Dock.Left, (CpfObject obj, string propertyName, object defaultValue, object oldValue, ref object newValue) =>
                {
                    if (obj is UIElement element && element.Parent != null)
                    {
                        element.Parent.InvalidateMeasure();
                    }
                });
            }
        }

var dock=DockPanel.Dock(button)//取值
DockPanel.Dock(button,Dock.Left)//設置值

 

計算屬性

計算屬性來自Vue里的computed  可綁定,只讀屬性

當SelectValue或者TextSize屬性值變化之後導致TestComputedProperty屬性值變化,有提供屬性通知

        [Computed(nameof(SelectValue), nameof(TextSize))]
        public string TestComputedProperty
        {
            get { return SelectValue == null ? "" : SelectValue.ToString() + TextSize; }
        }

 

 

CPF已經完成了Windows,Mac和Linux,PC端的跨平臺,移動端的還在計劃中。

 CPF、  Avalonia、 Maui一些對比

Avalonia是一個開源的跨平臺的UI框架,用Xaml描述UI的。

 

  CPF Avalonia Maui
最低框架依賴 .net standard2.0/netcore2.0  | net4(支持XP .net standard2.0/netcore2.0 Net6
當前狀態 可用 可用 未發佈,需要明年年底
獨立發佈的程式包大小

較小,依賴少,附帶dll少,Windows端手動裁剪可以到20多M,包含運行時。

如果用net4版,可以更小,不過只能Windows端

稍微大一些,附帶的dll多

估計會比較大,畢竟高版本的框架。

功能也更多。

UI開發模式 C#+CSS Xaml Xaml MVU(C#)
支持平臺 Windows,Mac,Linux,移動端暫時不支持 Windows,Mac,Linux,移動端支持 PC和移動端都支持
一些細節問題 多平臺支持中文輸入法,暫時不支持觸摸事件,暫時不支持硬體加速 輸入法支持度不夠,支持觸摸事件,支持硬體加速 支持
設計器 預覽和拖拽 預覽 xaml預覽和拖拽,mvu預覽

 

 

 

 

佈局控制項

 

 

 

運行的時候,查看元素和調試

cpf元素查看和調試

 

一份代碼,兩個目標框架支持,一部分代碼通過編譯條件符來區分

 

 我也不敢說我的CPF有多完善,至少常用控制項基本都有了,寫寫小工具,小應用還是可以的。之後會進一步完善。如果你想使用CPF,必須用VS2019,才能安裝插件來做設計器預覽,才能發佈Netcore3。

dll免費,可以商業開發。

 

官網:http://cpf.cskin.net/

 

 以後會陸續發佈一些cpf的教程

 

 

 

 

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 方法重載(Overload): 兩同(同一個類、同一個方法名)三不同(參數列表不同:;類型、個數、順序) 返回值不同,構成重載嗎? No 形參名稱不同,構成重載嗎? No 方法重寫(0verride): 子類定義一個和父類方法名,參數完全相同的方法。 =: 方法名保持一致 >=: 子類許可權修飾符可以 ...
  • 上篇文章提到FFmpeg解決項目中視頻和語音問題,說道C#和FFmpeg不得不提的2個類庫。1、Xabe.FFmpeg簡單查看了下源碼和demo,發現基於ffmpeg.exe的命令行參數進行處理。2、FFmpeg.AutoGen 把C語言對外API和類型翻譯成C#的API和對象。看了一下這個源碼生成... ...
  • 只讀成員 private struct Point { public Point(double x, double y) { X = x; Y = y; } private double X { get; set; } private double Y { get; set; } private r ...
  • 在斷斷續續的瞭解c#中,最先想到的就是ASP.NET開發了,在C2中應用也慢慢開始比較廣泛了,比如Covenant,有跨平臺的特性,值得看一看。 ...
  • 基礎概念 Microsoft中間語言(MSIL),也成為通用中間語言(CIL),是一組與平臺無關的指令,由特定於語言的編譯器從源代碼生成。MSIL是獨立於平臺的,因此,他可以在任何公共語言基礎架構支持特定的環境上執行。 通過JIT編譯器將MSIL轉換為特定電腦環境的特定機器代碼。這是在執行MSIL ...
  • 項目背景: 工作之餘兼職一家公司(方向是工業4.0)給做IM系統,主要功能包括:文字、 圖片、文件傳輸、遠程協助、視頻語音等等。這些功能都是基於群會話, 比如工廠操作工人遇到問題,請求遠程專家,這個初級專家不能解決問題,會邀請一個高級專家進來解決。開發過程中主要遇到的問題是視頻和語音這一塊,像其他的... ...
  • 一、前言 回顧:認證授權方案之授權初識 從上一節中,我們在對授權系統已經有了初步的認識和使用,可以發現,asp.net core為我們提供的授權策略是一個非常強大豐富且靈活的認證授權方案,能夠滿足大部分的授權場景。 在ConfigureServices中配置服務:將授權服務添加到容器 public ...
  • 寫在前面 Docker作為開源的應用容器引擎,可以讓我們很輕鬆的構建一個輕量級、易移植的容器,通過Docker方式進行持續交付、測試和部署,都是極為方便的,並且對於我們開發來說,最直觀的優點還是解決了日常開發中的環境配置與部署環境配置上的差異所帶來的種種疑難雜症,從此推脫產品的措辭也少了——“我電腦 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...