WPF仿網易云搭建筆記(2):組件化開發

文章目錄

  • 前言
  • 專欄和Gitee倉庫
  • 依賴屬性
  • 實戰:縮小,全屏,關閉按鈕
    • 依賴屬性操作封裝
    • 主窗口傳遞this本身給TitleView標題控件
    • 主要代碼
      • MainWindow.xmal
      • MainWindow.cs
      • 依賴屬性方法封裝
      • TitleView.cs
      • TitleViewModel
      • TitleViewModel
      • 實現效果

前言

這次我們來講解一下WPF 的組件化開發流程,組件化開發是是可以極大降低我們頁面開發難度,降低代碼耦合的方法。這讓我們可以將任意WPF界面進行拆解。因為我寫過Vue,所以我會按照Vue的邏輯將WPF進行組件化開發。

專欄和Gitee倉庫

WPF仿網易云 Gitee倉庫

WPF仿網易云 CSDN博客專欄

依賴屬性

WPF為了提高性能,限制了Binding的使用。需要將屬性提前注冊為依賴屬性或者附加屬性,才能解決使用Binding語法。原因是每個能binding的屬性需要在內存中開辟存儲空間。WPF默認不能Binding,需要主動聲明才可以。

這個就是為什么Elelctron,Fullter等內存開銷那么大,是因為他們的將可能沒用的的內存空間也設置了。

博客園 痕跡g WPF依賴屬性詳解

B站 十月的寒流 WPF 中依賴屬性及附加屬性的概念及用法

B站 微軟系列技術教程 WPF依賴屬性詳解

實戰:縮小,全屏,關閉按鈕

這里我講解一下Window和UserControl兩者的區別。Window就是整個窗口,UserControl就是控件。Window負責窗口的一些方法,比如拖拽,縮小放大。而我們是組件化開發,我們就需要將主窗口的this傳給子組件

依賴屬性操作封裝

這里先去看我這個總結的博客。

WPF 用戶控件依賴屬性賦值

主窗口傳遞this本身給TitleView標題控件

因為我們是View和ViewModel開發,所有的View只有傳遞參數和暴露依賴屬性的作用,實際的業務是ViewModel去做的。
所以我們傳遞的方向是

MainWindow
MainWindowViewModel
TitleView的MainWindow依賴屬性
TitleViewModel的MainWindow

主要代碼

MainWindow.xmal


<Window x:Class="BlankApp1.Views.MainWindow"......><!--需要主動設置名稱,不然會Binding錯誤--><Window.DataContext><ViewModels:MainWindowViewModel x:Name="MainWindowViewModel" /></Window.DataContext><DockPanel LastChildFill="True"><!--其它代碼--><Grid DockPanel.Dock="Top"MouseLeftButtonDown="Grid_MouseLeftButtonDown"Height="auto"><!--手動指定DataContext--><Views:TitleView  MainWindow="{Binding MainWindow, ElementName=MainWindowViewModel}"  /></Grid></DockPanel>
</Window>

MainWindow.cs

    public partial class MainWindow : Window{public MainWindowViewModel ViewModel { get; set; }public MainWindow(){InitializeComponent();//重定向ViewModelViewModel = (MainWindowViewModel)DataContext;ViewModel.MainWindow = this;}}

依賴屬性方法封裝

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;namespace BlankApp1.Utils
{public class MyWpfExtension<View> where View : class{/// <summary>/// 簡化依賴注入代碼/// </summary>/// <typeparam name="View"></typeparam>/// <typeparam name="Value"></typeparam>/// <param name="name"></param>/// <param name="action"></param>/// <returns></returns>public DependencyProperty DependencyPropertySet<Value>(string name, Action<View, Value> action){var res = DependencyProperty.Register(name, typeof(Value), typeof(View), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,new PropertyChangedCallback((item, res) =>{var model = item as View;var value = (Value)res.NewValue;if (model != null){action(model, value);}else{throw new Exception("model value is null");}})));return res;}}
}

TitleView.cs


namespace BlankApp1.Views
{/// <summary>/// TitleView.xaml 的交互邏輯/// </summary>public partial class TitleView : UserControl{//這個只是為了代碼提示,不涉及邏輯public MainWindow MainWindow { get; set; }//初始化依賴屬性構造器public  static readonly MyWpfExtension<TitleView> MyWpfExtension = new MyWpfExtension<TitleView>();//這個是簡化后的依賴屬性public static readonly DependencyProperty MainWindowProperty = MyWpfExtension.DependencyPropertySet<MainWindow>("MainWindow", (view, value) =>{//通過依賴屬性來獲取MainWindow的對象view.TitileViewModel.MainWindow = value;});/// <summary>/// DataContext的數據/// </summary>public TitileViewModel TitileViewModel { get; set; }public TitleView(){InitializeComponent();//拿到DataContext數據重定向TitileViewModel = (TitileViewModel)DataContext;}}
}

TitleViewModel

using BlankApp1.Models;
using BlankApp1.Views;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using System.Windows;namespace BlankApp1.ViewModels
{public partial class TitileViewModel:ObservableObject{public RelayCommand CloseWindow { get; set; }public RelayCommand MaxOrNormalWindow { get; set; }public RelayCommand MiniWindow { get; set; }public MainWindow MainWindow { get; set; }public TitileViewModel() {//.......其它代碼CloseWindow = new RelayCommand(() => {MainWindow.Close();Debug.WriteLine("關閉窗口");});MaxOrNormalWindow = new RelayCommand(() => {if(MainWindow.WindowState == WindowState.Normal){MainWindow.WindowState = WindowState.Maximized;MainWindow.MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight;MainWindow.MaxWidth = SystemParameters.MaximizedPrimaryScreenWidth;}else{MainWindow.WindowState = WindowState.Normal;}Debug.WriteLine("最大化或正常窗口");});MiniWindow = new RelayCommand(() => {MainWindow.WindowState = WindowState.Minimized;Debug.WriteLine("縮小窗口");});}}
}

TitleViewModel

就是綁定按鈕事件,我就不放了
詳細代碼看我的Gitee倉庫地址

WPF仿網易云 Gitee倉庫

實現效果

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210753.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210753.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210753.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于以太坊的智能合約開發Solidity(函數繼承篇)

參考教程&#xff1a;【實戰篇】1、函數重載_嗶哩嗶哩_bilibili 1、函數重載&#xff1a; pragma solidity ^0.5.17;contract overLoadTest {//不帶參數function test() public{}//帶一個參數function test(address account) public{}//參數類型不同&#xff0c;雖然uint160可…

發送、接收消息,界面不及時刷新

發送、接收消息后 UI 沒展示&#xff0c;不及時刷新&#xff0c;大概率 是 SDK 的 UI 刷新功能被干擾&#xff0c;參考下面排查&#xff1a; 檢查 initWithAppkey 和 connectWithToken 使用的是否是 IMKit 核心類 RCIM 的方法&#xff0c;如果不是&#xff0c;請換成 RCIM 的。…

【刷題】位運算

2 n 2^n 2n 1<<n判斷某一位是否為1 s&1<<k將上面兩個組合&#xff0c;可以得到判斷一個集合中哪些內容包含&#xff0c;遍歷所有情況。 100140. 關閉分部的可行集合數目 一個公司在全國有 n 個分部&#xff0c;它們之間有的有道路連接。一開始&#xff0c;…

CentOS 7 離線安裝達夢數據庫8.0

前期準備工作 確認操作系統的版本和數據庫的版本是否一致 ## 查看系統版本&#xff1a;cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core)關閉防火墻和Selinux # 查看selinux是不是disabled / enforce cat /etc/selinux/config## 查看防火墻狀態 firewall-cmd …

數據結構之歸并排序及排序總結

目錄 歸并排序 歸并排序的時間復雜度 排序的穩定性 排序總結 歸并排序 歸并排序大家只需要掌握其遞歸方法即可&#xff0c;非遞歸方法由于在某些特殊場景下邊界難控制&#xff0c;我們一般很少使用非遞歸實現歸并排序。那么歸并排序的遞歸方法我們究竟是怎樣實現呢&#xff…

PHP醫院手術麻醉系統源碼,laravel、vue2 、mysql技術開發,自主知識產權,二開快捷

醫院手術麻醉系統全套源碼&#xff0c;有演示&#xff0c;自主知識產權 技術架構&#xff1a;PHP、 js 、mysql、laravel、vue2 手術麻醉臨床信息管理系統是數字化手段應用于手術過程中的重要組成部分&#xff0c;用數字形式獲取并存儲手術相關信息&#xff0c;既便捷又高效。…

每日一練2023.12.10—— 倒數第N個字符串【PTA】

題目鏈接&#xff1a;L1-050 倒數第N個字符串 題目要求&#xff1a; 給定一個完全由小寫英文字母組成的字符串等差遞增序列&#xff0c;該序列中的每個字符串的長度固定為 L&#xff0c;從 L 個 a 開始&#xff0c;以 1 為步長遞增。例如當 L 為 3 時&#xff0c;序列為 { a…

Qt Creator設置IDE的字體、顏色、主題樣式

Qt是一款開源的、跨平臺的C開發框架&#xff0c;支持Windows、Linux、Mac系統&#xff0c;從1995發布第一版以來&#xff0c;發展迅猛&#xff0c;最開始是用于Nokia手機的Symbian(塞班)系統和應用程序開發&#xff0c;現在是用于嵌入式軟件、桌面軟件(比如WPS、VirtualBox)、A…

【圖論筆記】克魯斯卡爾算法(Kruskal)求最小生成樹

【圖論筆記】克魯斯卡爾算法&#xff08;Kruskal&#xff09;求最小生成樹 適用于 克魯斯卡爾適合用來求邊比較稀疏的圖的最小生成樹 簡記&#xff1a; 將邊按照升序排序&#xff0c;選取n-1條邊&#xff0c;連通n個頂點。 添加一條邊的時候&#xff0c;如何判斷能不能添加…

Python實現PDF-Excel

輕松解決PDF格式轉Excel&#xff08;使用python實現&#xff09; 實現思路&#xff1a; 要將PDF轉換為Excel&#xff0c;可以使用以下步驟&#xff1a; 解析PDF內容&#xff1a;首先&#xff0c;需要使用Python中的第三方庫&#xff08;如PyPDF2、pdfminer等&#xff09;來解…

西南科技大學C++程序設計實驗十二(文件流操作)

一、實驗目的 1. 熟悉文件的基本操作; 2. 在類中添加打開文件、保存文件、讀取文件等處理函數; 二、實驗任務 1. 分析完善程序:主函數創建一個文件對象,每次打開文件,在其尾部添加數據。如果文件不存在,則新建該文件。請將空白處需要完善的功能補充完整。 #include …

mybatis-config.xml的配置

1&#xff1a;MyBatis 的常規配置文件 mybatis-config.xml 包含了對 MyBatis 框架的全局配置&#xff0c;下面是一個常見的示例&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD…

Java代碼重構技巧:提高可維護性和可擴展性

引言&#xff1a; 在軟件開發過程中&#xff0c;代碼重構是一項非常重要的任務。通過對代碼進行重構&#xff0c;可以提高代碼的可維護性和可擴展性&#xff0c;減少代碼的復雜度&#xff0c;增加代碼的可讀性和可測試性。本文將介紹一些常用的Java代碼重構技巧&#xff0c;幫助…

HTML中表格的語法及使用(詳解)

Hi i,m JinXiang ? 前言 ? 本篇文章主要介紹HTML中表格的語法及詳細使用以及部分理論知識 &#x1f349;歡迎點贊 &#x1f44d; 收藏 ?留言評論 &#x1f4dd;私信必回喲&#x1f601; &#x1f349;博主收將持續更新學習記錄獲&#xff0c;友友們有任何問題可以在評論區留…

Java集合框架定義以及整體結構

目錄 一、Java集合框架1.1 什么是java集合框架1.2 集合與數組 二、集合框架具體內容2.1 整體框架2.2 遺留類和遺留接口1.3 集合框架設計特點 參考資料 一、Java集合框架 1.1 什么是java集合框架 Java集合框架&#xff08;Java Collections Framework&#xff09;是Java平臺提…

高云GW1NSR-4C開發板上手使用

1.開發板 核心板&#xff0c;主芯片GW1NSR-LV4CQN48P&#xff0c;絲印文字“奧陶紀Octet&#xff0c;QQ群808770961”&#xff1a; 晶振&#xff1a;27MHz&#xff0c;22引腳 兩個按鍵&#xff1a;靠近中間&#xff0c;23引腳&#xff0c;按下為低電平&#xff1b;靠近外側&…

Flink 讀寫 HBase 總結

前言 總結 Flink 讀寫 HBase 版本 Flink 1.15.4HBase 2.0.2Hudi 0.13.0官方文檔 https://nightlies.apache.org/flink/flink-docs-release-1.17/zh/docs/connectors/table/hbase/ Jar包 https://repo1.maven.org/maven2/org/apache/flink/flink-sql-connector-hbase-2.2/1…

[Linux] yum安裝分布式LNMP架構

1. 在一臺主機安裝nginx&#xff08;192.168.136.120&#xff09; 1.1 搭建nginx相關的yum源 cd /yum.repos.d mkdir bak mv *.repo bak vim /etc/yum.repos.d/nginx.repo [nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/7/$basearch/ gpgche…

基于Python+Django+mysql圖書管理系統

基于PythonDjangomysql圖書管理系統 一、系統介紹二、功能展示三、其它系統四、獲取源碼 一、系統介紹 程序開發軟件&#xff1a;Pycharm 數據庫&#xff1a;mysql 采用技術&#xff1a; Django(一個MVT框架&#xff0c;類似Java的SSM框架) 人生苦短&#xff0c;我用Python&a…

【rabbitMQ】rabbitMQ的下載,安裝與配置

目錄 1. 下載Erland 安裝步驟&#xff1a; 配置環境變量&#xff1a; 校驗環境變量配置是否成功 2.下載MQ 安裝步驟&#xff1a; 添加可視化插件 &#xff1a; 啟動&#xff1a; 拒絕訪問 1. 下載Erland 因為rabbitMQ是基于Erland,所以在安裝rabbitMQ之前需要安裝Erla…