首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WPF 筆記:Hello WPF 基礎架構 (Application/Window/STAThread/專案結構)

     編輯:關於.NET

WPF 應用程式進入點、核心組件引用、Application/Window 模型、XAML/Code-behind 分離、VS 自動生成代碼機制 — 奠定所有 WPF 開發的基石。

最小 WPF 應用 (純代碼)

// MyApp.cs
using System;
using System.Windows; // 核心命名空間

namespace MyFirstAvalonApp {
    class MyApp {
        [STAThread] // WPF 必須單執行緒單元模型
        static void Main() {
            MessageBox.Show("Hello, Avalon"); // WPF 訊息盒
        }
    }
}

核心組件引用 (三大支柱)

組件命名空間核心功能
WindowsBase.dll`System.Windows` (基礎)DependencyObject, Dispatcher, 資源系統, 命令
PresentationCore.dll`System.Windows` (核心)Visual, UIElement, 佈局, 輸入, 繪圖
PresentationFramework.dll`System.Windows.Controls` 等Window, Control, Panel, 應用級框架

**注意**:引用的是 `\Framework\v3.0\` 下的 DLL,非 `\Framework\v2.0.50727\System.Windows.Forms.dll`。

MSBuild 專案檔結構

<Project DefaultTargets="Build" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <OutputType>winexe</OutputType> <!-- GUI 應用 -->
    <OutputPath>.\</OutputPath>
    <Assembly>1st.exe</Assembly>
  </PropertyGroup>
  <ItemGroup>
    <Compile Include="MyApp.cs" />
    <Reference Include="System" />
    <Reference Include="WindowsBase" />
    <Reference Include="PresentationCore" />
    <Reference Include="PresentationFramework" />
  </ItemGroup>
  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <!-- 關鍵導入 -->
</Project>
  • 命令列建置:`msbuild 1st.csproj`
  • `Microsoft.CSharp.targets` 位於 `C:\Windows\Microsoft.NET\Framework\v2.0.50727\`,定義 C# 建置完整流程。

Application 模式:兩類 WPF 應用

**統一入口**:`App.xaml` 的 `` 標籤,`StartupUri` 指定首個 Window/Page。

VS 自動生成代碼陷阱 (App.g.cs / Window.g.cs)

  • `Main()` 藏在 `App.g.cs` (分部類機制) — VS 隱藏以簡化專案視圖。
  • **查找技巧**:右鍵 `App` 類 →「轉到定義」→ 選擇 `App.g.cs` 即見 `Main()`。
  • **學習期建議**:手寫 `Main()` + `app.Run(new Window1())`,**註釋掉** `InitializeComponent()` 避免雙重初始化衝突。

Window 類與 XAML 等價性

// 純代碼建構 Window
class Window1 : Window {
    public Window1() {
        Title = "Hello, Avalon"; // 注意:非 Text 屬性
        Button btn = new Button {
            Content = "Click me!", Width = 200, Height = 25
        };
        btn.Click += (s,e) => MessageBox.Show("Clicked!");
        this.Content = btn; // Window 直接設 Content (單一子元素)
    }
}

// 等價 XAML 聲明
<Window x:Class="MyApp.Window1" Title="Hello, Avalon">
  <Button x:Name="btn" Content="Click me!" Width="200" Height="25" />
</Window>
// x:Name="btn" → 後台自動生成 Button btn 欄位,無需 FindName

關鍵等價對照

類型根標籤適用場景入口
**Window Application (C/S)**``桌面獨立程式`App.xaml` + `Application`
**Browser Application (B/S, XBAP)**``瀏覽器託管 (需信任)`App.xaml` + `Application`
代碼XAML原理
`this.Content = btn;`子元素放在 `` 內Window 繼承 ContentControl
`btn.Click += ...``x:Name="btn"` + 後台事件綁定分部類合併
`new Window1()``StartupUri="Window1.xaml"`Application 載入

避坑指南:VS 學習期 vs 實戰期

  1. 學習期:手寫 `Main()`、手寫 XAML、手寫 Code-behind,**不依賴設計器**,理解底層機制。
  2. 實戰期:全面使用 VS 模板、設計器、屬性視窗、XAML 智能提示,**信任自動生成代碼** (InitializeComponent、分部類合併)。
  3. 書中順序建議調整:先純代碼 → 再 XAML 等價 → 最後 VS 整合 — 避免初學者被自動生成代碼誤導。

理解 `STAThread`、`Dispatcher`、`Application`、`Window`、三大組件、MSBuild、分部類、XAML/Code-behind 雙重性 — 即擁有 WPF 開發的「地圖與指南針」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved