WPF項目學習.一

WPF項目搭建

版權聲明:本文為博主初學經驗,未經博主允許不得轉載。

一、前言

?  記錄在學習與制作WPF過程中遇到的解決方案。

   使用MVVM的優點是 數據和視圖分離,雙向綁定,低耦合,可重用行,相對獨立的設計和邏輯;

?

二、配置

系統環境:win10

開發工具:Visual Studio 2017

開發語言:C#.WPF (MVVM框架)

數據庫:SQLiteStudio

?

三、附件

  • vs_enterprise.exe? ?在線安裝 Visual Studio 2017 開發工具;
  • SQLiteStudio.zip? ? ?免安裝Sqlite輕量數據庫操作工具;
  • WPF-MVVM-Work.zip 項目源代碼;

四、步驟

  1. 創建項目;

    

  2. 文件夾層級;

  建文件夾:Model, ViewModel, View, Resources, Lib, Service, Common;

Model是模型層,屬性類存放的地方;也就是存放不涉及業務邏輯的代碼;

  例如:列表元素,接口參數,枚舉,數據交互的參數模型和View基礎元素屬性等等;

ViewModel是視圖模型層,是MVVM實現業務邏輯代碼的地方;

  例如:操作視圖界面數據的呈現,界面按鈕觸發的事件和操作數據庫前后對界面交互的事件;

View是視圖層,是窗體布局實現的地方;也就是呈現給用戶交互使用的界面窗體;

  例如:登錄頁面,查詢頁面,新增和編輯的頁面等;

Resources是資源庫層,里面存放聲音,圖片和樣式布局等統一調用外部資源的地方;

Lib是引用層,放置一些第三方引用便于調用,也可以用nuget統一管理第三方dll;

Service是服務層,是實現對數據庫或者對站點接口的操作,進行數據持久化和數據交互;

Common是工具層,是存放一些公共的代碼,統一調用,簡潔業務邏輯代碼的冗余;

    注:可以建文件夾,但更推薦新建類庫放置以上層級;

    

  3. 控件的使用與布局;

    3.1 從工具箱中直接拖拉控件;

      

    3.2 直接在代碼中編輯控件代碼;

      

  4. 代碼關聯;

    4.1 View與ViewModel的交互關聯:

      - View后臺的代碼關聯

     public MainWindow() //類名
        {InitializeComponent();
       //后臺代碼有這句就實現了View和ViewModel的綁定DataContext
= new MainWindowViewModel();
     }

?

      - 文本的綁定?

     前端:<TextBox Text="{Binding TxtInput}"/>
     后端:

        public string TxtInput
        {
          get => _txtInput;
          set
          {
            _txtInput = value;

            //用RaisePropertyChanged刷新前端綁定控件的輸入框文本內容
            RaisePropertyChanged("TxtInput");?
          }
        }

        private string _txtInput;

?

      - 事件的綁定

     前端:<Button Content="添加" Command="{Binding BtnAddContent}"/>
     后端:

        public MainWindowViewModel()?
        {

          //按鈕事件與業務的銜接? ?也可以在BtnAddContent的Set中寫
          BtnAddContent = new RelayCommand(AddContent);
        }

        //前端綁定的 添加按鈕 Command事件

        public RelayCommand BtnAddContent { get; set; }

        private void AddContent()
        {
?          //按鈕事件處理的業務邏輯代碼
        }

?

      - 樣式的綁定

      <TextBox Style="{StaticResource TxbTrigger}" Tag="序號..." /><Button Content="添加" Template="{StaticResource DefaultButton}" />

”TxbTrigger是輸入框水印樣式資源,DefaultButton是按鈕樣式資源模板;詳細樣式代碼,查閱源碼中的Resources-Style;“

    4.2 數據綁定和命令綁定的代碼(如果用第三方框架引用,就不需要編寫以下兩個方法類)
  //數據綁定
  public
class ViewModelBase : INotifyPropertyChanged{public event PropertyChangedEventHandler PropertyChanged;protected void RaisePropertyChanged<T>(Expression<Func<T>> action){var propertyName = GetPropertyName(action);RaisePropertyChanged(propertyName);}private static string GetPropertyName<T>(Expression<Func<T>> action){var expression = (MemberExpression)action.Body;var propertyName = expression.Member.Name;return propertyName;}public void RaisePropertyChanged(string propertyName){if (PropertyChanged != null)PropertyChanged(this,new PropertyChangedEventArgs(propertyName));}}
  //命令綁定
  public
class RelayCommand : ICommand{public Action ExecuteAction; //執行方法public Action<object> ExecuteCommand; //執行方法 帶參數public Func<object, bool> CanExecuteCommand; //執行方法的條件public RelayCommand(Action action)// 執行事件 {ExecuteAction = action;}
     //執行帶參數的事件
public RelayCommand(Action<object> action) {ExecuteCommand = action;}
     //根據條件執行帶參數的事件
public RelayCommand(Action<object> action, Func<object, bool> can) {ExecuteCommand = action;CanExecuteCommand = can;}
     //當命令可執行狀態發生改變時,應被激活
public event EventHandler CanExecuteChanged;
     //用于判斷命令是否可以執行
     public bool CanExecute(object parameter) {if (ExecuteAction != null) return true;return CanExecuteCommand == null || CanExecuteCommand(parameter);}
     //命令執行
public void Execute(object parameter) {if (ExecuteCommand != null) ExecuteCommand(parameter);else ExecuteAction();}}

ViewModel的業務類需要繼承ViewModelBase

  public class MainWindowViewModel : ViewModelBase

前端的DataGrid綁定的數據需要用ObservableCollection類型定義列表;

     public ObservableCollection<AddModel> AddContent{get => _addContent;set{_addContent = value;RaisePropertyChanged("AddContent"); 
            }}private ObservableCollection<AddModel> _addContent =
                  new ObservableCollection<AddModel>();

"AddModel"是Model中的屬性類;代表DataGrid中綁定的列名指向;

DataGrid前端代碼:

<DataGrid x:Name="DgTimes" 
  ItemsSource="{Binding AddContent}" AutoGenerateColumns="False"SelectedItem="{Binding SelectTime,UpdateSourceTrigger=PropertyChanged}"><DataGrid.InputBindings>
    <!--雙擊事件--><MouseBinding Gesture="LeftDoubleClick" Command="{Binding DgDoubleClick}" CommandParameter="{Binding ElementName=DgTimes,Path=SelectedItem}"/><!--單擊事件,也可以在SelectedItem選中事件中的set屬性編輯業務代碼-->
  <MouseBinding Gesture="LeftClick" Command="{Binding DgClick}"CommandParameter="{Binding ElementName=DgTimes,Path=SelectedItem}"/></DataGrid.InputBindings><DataGrid.Columns><DataGridTextColumn Header="序號" Binding="{Binding RowIndex}"/><DataGridTemplateColumn Header="勾選?" MinWidth="30"><DataGridTemplateColumn.CellTemplate><DataTemplate><Grid>
             <!--圖片的綁定,注意不能為null或者空值,不然會加載超慢--><Image Width="20" Height="20" Source="{Binding Photo}"/></Grid></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn><DataGridTextColumn Header="輸入內容" Binding="{Binding AddContent}"/><DataGridTextColumn Header="時間" Binding="{Binding AddTime}"/></DataGrid.Columns> </DataGrid>

?注:由于整個制作項目的操作視頻文件過大,如有所需,留郵箱地址給博主;

  5. 執行效果;

?

五、注意事項

本次項目制作并沒有使用數據庫的操作;源代碼中也是沒有!

源碼中包括了對輸入框限制數字的輸入方法;

源碼中包括了Button,TextBox,CheckBox,DataGrid等等樣式資源代碼;

有些網友推薦 MVVMLight 或者 Prism 等第三方MVVM框架引用;

?

?六、下篇預告

在制作WPF過程中遇到的問題以及解決方案;

其中包括:焦點的控制,鍵盤事件觸發,輸入框的數字限制,異步處理,隱藏狀態可用狀態,自定義屬性等等...

?

?

轉載于:https://www.cnblogs.com/yjwlogs/p/8459751.html

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

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

相關文章

airpods_如何通過AirPods與其他人共享音樂

airpodsKhamosh PathakKhamosh PathakUsing the new Audio Sharing feature introduced in iOS 13.1 and iPadOS 13.1, you can share audio from one iPhone with two AirPods. You can watch a video or listen to a song along with your friend in just a tap! 使用iOS 13.…

Laravel 5 多個視圖共享數據的方法

我們都知道模板一般會用到繼承&#xff0c;導航欄就是一個很好的例子&#xff0c;但是導航欄的數據如何共享&#xff0c;比如有個導航的文件叫在view/navigation.blade.php為了簡單一點&#xff0c;文件里只有設置了一個變量1{{ $cqh }}現在的要求是每個頁面都會用到這個變量&a…

HR面 - 十大經典提問

1、HR&#xff1a;你希望通過這份工作獲得什么&#xff1f; 1&#xff09;、自殺式回答&#xff1a;我希望自己為之工作的企業能夠重視質量&#xff0c;而且會給做得好的員工予以獎勵。我希望通過這份工作鍛煉自己&#xff0c;提升自己的能力&#xff0c;能讓公司更加重視我。 …

谷歌云使用賬號密碼_如何使用Google密碼檢查

谷歌云使用賬號密碼Google has a tool designed to securely analyze your passwords against a database of ones that are known to be compromised and breached. Password Checkup is available as an extension or a web service. Here’s how to use it. Google提供了一種…

HTML特殊字符編碼對照表

HTML特殊字符編碼對照表 特殊符號命名實體十進制編碼特殊符號命名實體十進制編碼特殊符號命名實體十進制編碼Α&Alpha;Β&Beta;Γ&Gamma;Δ&Delta;Ε&Epsilon;Ζ&Zeta;Η&Eta;Θ&Theta;Ι&Iota;Κ&Kappa;Λ&Lambda;Μ&Mu;Ν&a…

CentOS 7.0下使用yum安裝MySQL

CentOS7默認數據庫是mariadb,配置等用著不習慣,因此決定改成mysql,但是CentOS7的yum源中默認好像是沒有mysql的。為了解決這個問題&#xff0c;我們要先下載mysql的repo源。1.下載mysql的repo源$ wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm2.安裝my…

Jolicloud是一款適合上網本的漂亮新操作系統

Want to breathe new life into your netbook? Here’s a quick look at Jolicloud, a unique new Linux based OS that lets you use your netbook in a whole new way. 想為您的上網本注入新的活力嗎&#xff1f; 快速瀏覽一下Jolicloud&#xff0c;這是一個獨特的基于Linu…

Repeater片段

1.字段過長截取字符串 1.1 截取字符串類 可以直接substring 也可以<%# Utility.Common.GetShow( Eval("NewTitle").ToString(),20,true) %><td><%#fcwms.Common.GetContent.GetShow(Eval("com_address").ToString(), 19, true)%> </t…

谷歌瀏覽器的翻譯功能在哪_如何在Google表格中使用AND和OR功能

谷歌瀏覽器的翻譯功能在哪If you’ve ever wanted to check whether data from your Google Sheets spreadsheet meets certain criteria, you can use AND and OR. These logical functions give you TRUE and FALSE responses, which you can use to sort through your data.…

Reptile:requests + Xpath 爬取段子網的段子

2019/1/24 中午路飛學成 爬蟲課程 實驗及筆記。 Xpath是路飛爬蟲課程中老師說的三種解析方式之一&#xff0c;前面是re正則表達式的解析方式&#xff0c;現在是xpath的解析方式&#xff0c;后面還有一個是bs4的解析方式。 re其實我理解的很困難&#xff0c;而且到現在都還不怎么…

Android 系統權限

Android 是一個權限分隔的操作系統&#xff0c;其中每個應用都有其獨特的系統標識&#xff08;Linux 用戶 ID 和組 ID&#xff09;。系統各部分也分隔為不同的標識。Linux 據此將不同的應用之間、應用與系統之間分隔開來 ##一、安全架構 Android 安全架構的中心設計點是&#x…

【轉載】負數的二進制

https://jingyan.baidu.com/article/29697b9106eb52ab21de3c7a.html 將十進制的負數變成二進制數的過程&#xff1a; 1.寫出絕對值的二進制碼&#xff08;原碼&#xff09; 2.取反&#xff08;反碼&#xff09; 3.1,&#xff08;補碼&#xff09; 同理&#xff0c;將二進制的負…

保存網絡文章以供以后使用Instapaper閱讀

Have you ever come across a bunch of great articles that you want to read online, but just don’t have the time? Today we take a look at an online service that allows you to read your articles later, either online, or on an iPhone, or eReader. 您是否曾經遇…

谷歌chrome xp_將非Google任務列表添加到Chrome

谷歌chrome xpMost people rely on a task list to help them remember what they need to do but not everyone wants one that is tied to a Google account. If you have been wanting an independent tasks list then join us as we look at the Tasks extension for Googl…

學習筆記 - MarkDown 語法

學習參考網址&#xff1a;https://www.appinn.com/markdown/index.html # **gitskill**## 標題 ># 這是 H1 >## 這是 H2 >###### 這是 H6## 區塊引用 Blockquotes > This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, consectetuer adipisci…

[BZOJ4671]異或圖

description BZOJ 定義兩個結點數相同的圖\(G1\)與圖\(G2\)的異或為一個新的圖\(G\), 其中如果\((u,v)\)在\(G1\)與\(G2\)中的出現次數之和為\(1\), 那么邊\((u,v)\)在\(G\)中, 否則這條邊不在\(G\)中. 現在給定\(s\)個結點數相同的圖\(G1...s\),設\(S{G1,G2,...,Gs},\) 問\(S\…

我們生活在最好的時代

2019獨角獸企業重金招聘Python工程師標準>>> 沒規劃的人生叫拼圖&#xff0c;有規劃的人生叫藍圖&#xff1b; 沒目標的人生叫流浪&#xff0c;有目標的人生叫航行&#xff01; 我們生活在最好的時代&#xff1a;在認知和學習機會上&#xff0c;人人平等&#xff0c…

MapReduce詳解和WordCount模擬

最早接觸大數據&#xff0c;常縈繞耳邊的一個詞「MapReduce」。它到底是什么&#xff0c;能做什么&#xff0c;原理又是什么&#xff1f;且聽下文講解。 是什么 MapReduce 即是一個編程模型&#xff0c;又是一個計算框架&#xff0c;它充分采用了分治的思想&#xff0c;將數據處…

無法創建系統映像_如何創建USB驅動器的映像

無法創建系統映像You can back up your USB drive by creating a saved image. You can then take that saved image and clone multiple USB sticks. This guide shows you how to create an image of your USB drive using Windows 10. 您可以通過創建保存的圖像來備份USB驅動…

UGUI事件之Drag拖拽事件

UI事件之Drag拖拽事件2.UGUI 事件命名空間   當我們需要使用 UGUI 中的事件的時候&#xff0c;需要在腳本內引入專有命名空間&#xff1a;   using UnityEngine.EventSystems;----------------------------------2.拖拽相關事件接口----------------------------------1.三…