ASP.NET Zero--後端應用程式

来源:http://www.cnblogs.com/liyongke/archive/2017/05/07/6820557.html
-Advertisement-
Play Games

後端應用程式 這是用戶名和密碼輸入的實際應用程式。您將主要在此應用程式上添加您的業務需求。 應用文件夾 後端應用程式預設內置在專用區域,名為“ App ”,但可以在創建解決方案時確定。因此,所有控制器,視圖和模型都位於 Areas / App文件夾下。此外,相關腳本和樣式文件位於wwwroot / ...


後端應用程式

這是用戶名和密碼輸入的實際應用程式。您將主要在此應用程式上添加您的業務需求。

應用文件夾

後端應用程式預設內置在專用區域,名為“ App ”,但可以在創建解決方案時確定因此,所有控制器,視圖和模型都位於 Areas / App文件夾下。此外,相關腳本和樣式文件位於wwwroot / view-resources / Areas / App文件夾下,如下所示:

應用程式文件夾

應用程式的主菜單在AppNavigationProvider 類中定義請參閱ABP的 導航文檔,以深入瞭解創建菜單。當您添加新的菜單項時,它會自動在佈局中呈現。

佈局

應用程式的佈局位於Areas / App / Views / Layout 文件夾下。它使用組件頁眉頁腳 側邊欄

應用程式佈局

主菜單在側邊欄組件中呈現 佈局還高度使用捆綁和壓縮(見下文)系統的腳本和樣式包括。

版本管理

如果您沒有開發多租戶應用程式,則可以跳過本節。

大多數SaaS(多租戶)應用程式都有具有不同功能的版本(包) 因此,他們可以為其租戶(客戶)提供不同的價格和功能選項。 版本頁面(可在host登錄中使用用於管理應用程式的版本:

版本頁面

版本用於分組功能值並分配給租戶。當我們點擊版本的操作/編輯時,我們可以看到它已分配的功能:

編輯版本功能

啟動項目僅包含每個版本/租戶可以啟用/禁用聊天功能(並且它是2個子功能)。所有功能都在 AppFeatureProvider中定義特征值存儲在 AbpFeatures表中。功能不限於布爾(啟用/禁用)值,並且可以包含不同類型的值,如下所示: 

版本功能編輯

 有關更多信息,請參閱 功能管理和 版本管理文檔。

租戶管理

如果您沒有開發多租戶應用程式,則可以跳過本節。

如果這是一個多租戶應用程式,並以host用戶身份登錄,則顯示租戶頁面:

租戶管理頁面

租戶由租戶類代表。可以通過添加新的屬性類來拓展租戶類 只有一個租戶,預設為 Default。租戶名稱(代號名稱)是租戶唯一名稱。租戶可以是激活或鎖定如果是鎖定狀態的,那麼這個租戶的用戶不能登錄到應用程式。

當我們點擊“ 創建新租戶 ”按鈕時,會顯示一個對話框:

創建租戶

租用名稱應該是唯一的,不能包含空格或其他特殊字元,因為它可以用作子功能變數名稱(如tenancyname.mydomain.com。請參閱下麵的部分)。名字可以是任何東西。管理員電子郵件 用作新客戶的管理員用戶的電子郵件地址。用戶將自動創建管理員用戶。我們可以為管理員設置隨機密碼併發送激活郵件。當用戶首次登錄時,他/她應該更改密碼。我們可以取消選中此項以輸入已知密碼。

當我們創建一個新的租戶時,我們應該選擇/創建一個資料庫來存儲新租戶的數據。我們可以選擇“ 使用主機資料庫 ”將租戶數據存儲在主機資料庫中(可以用於單個資料庫方法),或者我們可以指定一個連接字元串來為新租戶創建/使用專用資料庫 AspNet Zero支持混合方式。這意味著您可以為某些租戶使用host資料庫,併為其他租戶創建專用資料庫。即使您可以一些租戶分組在一個單獨的資料庫中。

所有租戶操作都由TenantAppService 類處理示例(刪除租戶):

[AbpAuthorize(AppPermissions.Pages_Tenants_Delete)]
 public  async Task DeleteTenant(EntityRequestInput input)
{
    var tenant = wait TenantManager.GetByIdAsync(input.Id);
    CheckErrors(wait TenantManager.DeleteAsync(tenant));
}

TenantAppService主要使用TenantManager功能變數名稱服務進行租戶操作。

租戶版和功能

一個版本可以分配給租戶(創建或編輯)。租戶將繼承分配版本的所有功能。但是我們也可以覆蓋租戶的功能和價值。單擊 租戶的操作/更改功能自定義 其功能:

租戶功能

租戶用戶模仿

作為host用戶,我們可能希望代表租戶執行操作。在這種情況下,我們可以在操作中單擊“ 登錄為此租戶 ”按鈕。當我們點擊它,我們看到一個模式來選擇租戶的用戶我們可以選擇任何用戶並執行允許該用戶的操作。有關詳細信息,請參閱 本文檔中的“ 用戶模擬”部分。

將租約名稱用作子功能變數名稱

多租戶應用程式通常使用子域來識別當前租戶。 tenant1 .mydomain.com,tenant2 .mydomain.com等。ASP.NET Zero自動識別並從子域獲取租戶名稱(請參閱主機設置部分)。

組織單位

組織單位(OU)用於對用戶和實體進行分層分組。那麼你可以根據他們的OU來獲取用戶或實體。當我們點擊管理/組織單位時,我們進入相關頁面:

組織單位頁面

在這裡,我們可以管理OU(創建,編輯,取消,移動)和成員(添加/刪除)。

OrganizationUnitManager用於管理OU, UserManager用於管理代碼中的OU成員。 OrganizationUnitAppService執行應用程式邏輯。

在左OU樹中,我們可以右鍵單擊一個OU(或左鍵點擊到 右側的箭頭)打開OU操作的上下文菜單當我們嘗試 添加一個成員時,顯示一個模態來選擇用戶:

選擇一個用戶對話框

這實際上是一個通用的查找模式,可用於選擇任何類型的實體(請參閱區域/應用/視圖/公共/模態/ _LookupModal.cshtml及其相關的腳本文件)。要選擇用戶,我們創建FindUsers 的方法CommonLookupAppService然後配置模式使用此方法的工作(見景資源/區/應用/瀏覽/ OrganizationUnits / index.js為lookupModal.open的使用文件)。

有關詳細信息,請參閱 組織單位管理文件

角色管理

當我們點擊管理/角色菜單,我們進入角色管理頁面:

角色管理頁面

角色用於分組許可權當用戶有角色時,他/她將具有該角色的所有許可權。

角色由Role類表示。角色類可以通過添加新的屬性來擴展。

RoleManager執行域邏輯,RoleAppService 執行角色的應用程式邏輯。

角色可以是動態的或靜態的:

  • 靜態角色:靜態角色具有已知名稱 (如“admin”),不能更改此名稱(我們可以更改 顯示名稱)。它在系統啟動時存在,無法刪除。因此,我們可以根據靜態角色名編寫代碼。
  • 動態角色:部署後可以創建動態角色。然後我們可以授予該角色的許可權,我們可以將角色分配給某些用戶,我們可以將其刪除。我們不能在開發時間內知道動態角色的名稱。

一個或多個角色可以設置為預設預設角色預設分配給新添加/註冊的用戶。這不是開發時屬性,可以在部署後設置或更改。

在啟動項目中,我們對host(對於多租戶應用程式)具有靜態管理員角色。此外,我們還為租戶提供靜態管理員用戶角色。管理角色預設授予所有許可權。用戶角色是新用戶預設角色,預設情況下沒有許可權。這些可以輕鬆改變。有關所有靜態角色,請參閱StaticRoleNames類和更改靜態角色的AppRoleConfig

角色許可權

由於角色用於分組許可權,因此我們可以在創建或編輯角色時設置許可權,如下所示:

角色許可權

(並非所有許可權如上圖所示)

每個租戶都有自己的角色,租戶角色的任何改變都不會影響其他租戶。而且,host也有自己的角色。

用戶管理

當我們單擊管理/用戶菜單時,我們進入用戶管理頁面:

用戶管理

用戶是可以登錄應用程式並根據其許可權執行某些操作的人員

用戶類代表用戶,可以通過添加新屬性來拓展用戶類 

UserManager 用於執行域邏輯,UserAppService用於為用戶執行應用程式邏輯。

用戶可以有零個或多個角色如果用戶具有多個角色,則他將繼承所有這些角色的許可權。此外,我們可以設置用戶特定的許可權用戶特定許可權設置將覆蓋此許可權的角色設置。用戶許可權對話框的截圖:

用戶許可權

(並非所有許可權如上圖所示)

對話框用於創建/編輯用戶:

編輯用戶

我們可以更改用戶密碼,使其 激活/鎖定 等等...用戶擁有個人資料圖片用戶可以更改(請參閱用戶菜單部分)。管理員 用戶不能作為業務規則刪除。如果你不想使用管理員,你可以鎖定它。

用戶模擬

作為管理員(或任何允許的用戶),我們可能希望以用戶身份登錄,並代表該用戶執行操作,而不知道他的密碼。當我們在用戶的操作中點擊“ 以此用戶身份登錄 ”圖標時,我們將自動重定向並以此用戶身份登錄。這被稱為“ 用戶模擬 ”。當我們模擬用戶時,“ 回到我的帳戶 ”選項被添加到用戶配置文件菜單中:

返回我的帳戶鏈接

在一個模擬帳戶中,我們只能執行該用戶允許的操作。這意味著,一切正好可以作為此相同用戶登錄自己的能力。唯一的區別是在審計日誌中顯示,這表明操作是由其他人執行的。註意; 此外,用戶名附近還顯示一個紅色的“返回”圖標,表示您處於模擬帳戶。

在Web項目的AccountController中進行模擬

語言管理

語言管理頁面用於管理(添加/編輯/刪除)應用程式語言並更改本地化文本

語言管理

我們可以創建新語言,編輯/刪除現有語言,並將語言設置為預設語言註意; 租戶無法編輯/刪除預設語言,但host用戶可以做。

當我們點擊更改任何語言的文本時,我們被重定向到一個新的視圖來編輯語言文本:

語言文本

我們可以選擇任何語言作為基礎(參考)並更改 目標語言的文本。基礎語言只是為了幫助翻譯進度。由於可能有不同的 本地化來源,我們選擇要翻譯的源。當我們點擊編輯圖標時,我們可以看到所選文本的編輯模式:

語言文字編輯

host用戶(如果允許的話)可以編輯語言和本地化的文本。對於多租戶應用程式的所有租戶,這些語言將是預設的。 租戶繼承語言和本地化的文本,可以 覆蓋本地化的文本或添加新的語言。

兩個頁面都使用LanguageAppService類作為應用程式服務。它具有管理語言和本地化文本的方法。 IApplicationLanguageManagerIApplicationLanguageTextManager 介面用於執行域邏輯(由LanguageAppService使用)。

有關更多信息,請參閱 語言管理和 本地化文檔。

審核日誌

在審核日誌頁面中,我們可以看到與應用程式的所有用戶交互:

審核日誌

所有應用程式服務方法和MVC控制器操作都會自動記錄,可以在這裡查看。請參閱 審核日誌文檔以瞭解如何進行配置。當我們點擊放大鏡圖標時,我們可以看到所有的細節是一個審核日誌:

審核日誌

審計日誌報告由AuditLogAppService提供

主機設置

主機設置頁面用於配置一些系統設置:

一般主機設置

時區是此頁面中的重要設置。AspNet Zero可以在多個區域工作。每個用戶可以在自己的時區中看到日期和時間。此頁面中的時區設置允許您為應用程式(包括所有租戶和用戶)設置預設時區。租戶和用戶可以在自己的設置中更改時區。時區設置僅在使用UTC時鐘時可用。 請參閱文檔以切換到UTC。

SAVE ALL按鈕可以一鍵保存所有設置。HostSettingAppService用於檢索和保存設置(有關詳細信息,請參閱設置提供程式部分)。

主機設置頁面中的“ 安全 ”選項卡包含密碼複雜性和其他安全設置。主機可以在此選項卡中定義系統範圍的安全設置。每個租戶都可以在租戶設置頁面中覆蓋此設置。PasswordComplexityChecker 類負責檢查密碼是否滿足密碼複雜度設置。

租戶設置

租戶設置

在多租戶應用程式中,租戶設置如下所示:

租戶設置

如果我們禁用多租戶,那麼這個頁面也會顯示一些主機設置(因為沒有主機設置頁面)。租戶還可以定義用戶的密碼複雜度設置,也可以使用主機用戶定義的密碼複雜度設置。

TenantSettingAppService用於獲取/設置租戶設置。

啟用LDAP(ACTIVE DIRECTORY)身份驗證

LDAP(Active Directory)預設情況下禁用身份驗證。為了使其工作,我們應該禁用多租戶,因為LDAP auth不會在多租戶系統中正常使用。在.Core項目的CoreModule類中,我們應該啟用以下行:

Configuration.Modules.ZeroLdap().Enable(typeof(AppLdapAuthenticationSource));

然後,我們可以在設置頁面中看到LDAP設置部分:

LDAP設置

我們可以檢查“ 啟用LDAP驗證 ”以啟用它。如果伺服器在域和應用程式中運行域用戶或本地系統,則通常甚至不需要設置功能變數名稱,用戶和密碼。您可以註銷,然後使用您的域用戶名和密碼登錄如果沒有,您應該設置這些憑據。

.Net core相容性

LDAP認證尚未被.net core支持。因此,它被設計為有條件的。如果您使用的是.Net Framework(4.6+),那麼它將可用,否則將被禁用。

維護

維護頁面可用於多租戶應用程式的host(單租戶應用程式在租戶側顯示),如下所示:

維護緩存

在“ 緩存 ”選項卡中,我們可以清除一些或所有高速緩存。如果您手動更改資料庫並希望刷新應用程式緩存,則可能需要清除緩存。CachingAppService用於清除伺服器端的緩存。

網站日誌選項卡用於查看和下載日誌:

維護日誌

WebLogAppService用於從伺服器獲取日誌。

租戶儀錶板

ASP.NET Zero啟動項目還包括示例 儀錶板。這隻是為了演示目的,您可以將其作為實際儀錶盤的起點:

儀錶板

在這裡,只有會員活動圖數據從伺服器(從TenantDashboardAppService中 檢索您可以單擊刷新按鈕生成隨機圖。

通知

通知圖標位於語言選擇按鈕旁邊。紅色圓圈中的數字顯示未讀通知計數。

通知

用戶可以通過點擊此圖標看到3個最近的通知。

通知

用戶可以通過單擊“將所有設為全部”鏈接將所有通知標記為已讀,或者通過單擊每個通知旁邊的“設置為已讀”鏈接來標記單個通知。

通知使用SignalR實時發送。另外,收到 通知時會顯示桌面推送通知

通知設置

“設置”鏈接打開通知設置對話框。

通知

在此對話框中有一個用於啟用/禁用接收通知的全局設置。如果啟用此設置,則用戶可以單獨啟用/禁用每個通知。

您還可以在AppNotificationProvider 類中定義自定義通知例如,新用戶的註冊通知在所定義的AppNotificationProvider如下。

context.Manager.Add(
      new NotificationDefinition(
        AppNotificationNames.NewUserRegistered,
        displayName:L(“NewUserRegisteredNotificationDefinition”),
        permissionDependency:new SimplePermissionDependency(AppPermissions.Pages_Administration_Users)
);

有關 詳細信息,請參閱通知定義部分。

AppNotifier類用於發佈通知。 NotificationAppService類用於管理通知的應用程式邏輯。有關詳細信息,請參閱通知文檔。

通知單

用戶的所有通知都列在此頁面中。

通知單

.Net core相容性

由於SignalR還沒有為.net core準備就緒,如果您選擇.net core作為基礎框架,實時通知將不起作用。

聊天圖標位於頁面右上角的用戶個人資料圖像旁邊。紅色圓圈中的數字顯示未讀的聊天消息計數。

用戶菜單

當用戶點擊此圖標時,聊天面板將出現在頁面右側。此面板包含用戶的朋友和被阻止的用戶列表。

用戶菜單

用戶可以通過將用戶名寫入朋友列表中的用戶名文本框中來添加新朋友。如果為租戶啟用“與其他租戶聊天”功能,則可以通過寫[租戶名稱] \ [用戶名](例如:預設\ admin)將其他租戶的用戶添加為朋友。如果啟用了“與host用戶聊天”功能,host用戶可以通過在相同的文本框中寫入。\ [用戶名]添加為朋友。

雖然線上朋友/用戶的個人資料圖片上有一個綠色圓圈,但離線的朋友/用戶都有一個灰色的圈子。

用戶可以通過點擊聊天面板右上角的針圖標來定位或取消打開聊天面板。應用程式嘗試記住聊天面板的最後狀態,併在用戶登錄到應用程式時恢復。

當選擇了一個朋友/用戶時,會話面板被打開。

用戶菜單

用戶可以阻止或解除此區域中的朋友/用戶。所選用戶用戶名右側有一個扳手圖標。此圖標打開一個操作菜單,該菜單包含塊用戶或根據用戶的塊狀態取消阻止用戶操作。

聊天消息通過使用ChatMessageManager域類的ChatHub signalR集線器類傳播

ChatUserStateWatcher類負責觀看聊天用戶的線上/離線狀態更改。當用戶上線或離線時,該類抓取狀態更改並通知相關用戶的朋友。

FriendshipAppServiceFriendshipManager類負責管理友誼請求。來自被阻止的用戶的聊天消息不會傳遞給目標用戶。

由於聊天是一個實時操作,應用程式會緩存線上用戶的朋友和每個朋友的未讀消息數。UserFriendsCache 類管理這些緩存操作。

UserFriendCacheSyncronizer類負責保持用戶的朋友緩存最新。為了做到這一點,它會觀看Friendship和ChatMessage實體的一些事件。

.Net core相容性

由於SignalR尚未準備好.net core,如果您選擇.net核心作為基礎框架,聊天功能將無法正常工作。

聊天功能

用戶菜單

系統中有三個聊天功能。這些是“聊天”,“與主機聊天”,“與其他租戶聊天”。每個版本/租戶可以啟用/禁用這些功能。通過使用這些功能,主機可以啟用/禁用與其他租戶的用戶或主機用戶的聊天。

用戶菜單

用戶可以點擊右上角的姓名打開用戶菜單:

用戶菜單

鏈接帳戶

鏈接的帳戶用於將多個帳戶相互鏈接。以這種方式,用戶可以使用此功能輕鬆瀏覽他/她的帳戶。

用戶可以通過點擊“管理帳戶”鏈接來鏈接新帳戶或刪除已鏈接的帳戶。

用戶菜單

為了鏈接新帳戶,用戶必須輸入相關帳號的登錄憑據。

鏈接新帳號

UserLinkAppService類用於管理帳戶鏈接的應用程式邏輯, UserLinkManager類用於管理用於帳戶鏈接的域邏輯。

配置文件設置

我的設置用於更改用戶配置文件設置:

用戶設置

如下所示,管理員用戶名無法更改。它被認為是一個特殊的用戶名,因為它被用於資料庫遷移種子。其他用戶可以更改其用戶名。ProfileAppService用於獲取/更改設置。

登錄嘗試

所有登錄嘗試(失敗的成功)都記錄在應用程式中。用戶可以看到他/她的帳戶的上次登錄嘗試。UserLoginAppService 用於從伺服器獲取登錄嘗試。

登錄嘗試

更換圖片

用戶可以更改自己的個人資料圖片。ProfileController用於上傳和獲取用戶個人資料圖片。目前,支持jpg / jpeg,gif和png文件,您可以擴展它。

更改密碼

ProfileAppService用於更改密碼。

登出

AccountController用於註銷用戶並重定向到登錄頁面。


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

-Advertisement-
Play Games
更多相關文章
  • 什麼是架構,談下你項目中用的是什麼樣的架構?!! What?這個問題怎麼熟悉!!原來是在面試的時候經常面試官會問出這個問題。 架構是項目系統實施的整個思維過程。他不是一件容易的事。 需要架構師能夠充分把握業務需求,對行業及項目具有前瞻性的眼光,對抽象思維有精深的能力,應對變化有足夠的反應,這樣才... ...
  • 《Effective C#》快速筆記 - C# 中的動態編程 靜態類型和動態類型各有所長,靜態類型能夠讓編譯器幫你找出更多的錯誤,因為編譯器能夠在編譯時進行大部分的檢查工作。C# 是一種靜態類型的語言,不過它加入了動態類型的語言特性,可以更高效地解決問題。 本系列 《Effective C#》快速筆 ...
  • 背水一戰 Windows 10 之 控制項(ScrollViewer 特性): Chaining - 鎖鏈, Rail - 軌道, Inertia - 慣性, Snap - 對齊, Zoom - 縮放 ...
  • 根據一個給定經緯度的點和距離,搜索附近5公裡範圍的地點 –合理利用演算法 功能需求:需要查詢一個站點(已知該站點經緯度)5公裡範圍內的其它站點。 方 法 一 :對每條記錄,去進行遍歷,跟資料庫中的每一個點進行距離計算,當距離小於5公裡時,認為匹配(效率極其低下,耗時長)。 方 法 二 :先過濾出大概的 ...
  • "沒有時間了!" 本次學習mongoDB,參考瞭如下文章: Using MongoDB with ASP.NET Core – Part II (Implementation) 來自 MongoDB學習筆記(二) 通過samus驅動實現基本數據操作 來自 略去如何安裝和調試MongoBD,可參見上述... ...
  • 我遇到問題產生的原因:資料庫表的某個欄位為不能為空。在修改實體屬性的時候,實體對應的表中不能為空的欄位為null。 詳情: 資料庫: c #: 錯誤代碼: 正確代碼: ...
  • 最近由於工作需要,做一個C#的簡單程式。學習了一些基礎東西先記下來。 主要有: 1.生成初始框架 2.打亂順序 3.游戲部分,點擊按鈕後與空白部分交換的只是Text和Visible部分 ...
  • 前端應用程式 ASP.NET Zero包含可以作為您的公共網站或應用程式著陸頁的起點的前端頁面。首次運行項目時,您會看到主頁如下所示: 這裡有兩頁:主頁和關於。這些頁面的內容只是占位符和演示目的。您可以根據需要完全刪除內容並構建頁面。此外,你應該改變的標誌與貴公司的標誌。 請參閱 metronic前 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...