C# WPF vs WinForm

本文深入探讨了WPF和WinForm的区别与应用,通过实例代码展示了两者在界面设计、编程方式、命名空间、控件实现等方面的差异,并附有详细注释帮助理解。

C# WPF vs WinForm

  WPF,WCF  如雷贯耳 早听说 WPF,WCF大名,但是就是一直没有去了解她……今天突然想去看看她长啥样?

 主要是给自己留个笔记,顺便比较下WPF和Winform之前的区别

1.什么是WPF?有什么用?

  定义:Windows Presentation Foundation(WPF){ [,prezən'teiʃən, ,pri:-] n. 描述,陈述;介绍;赠送、 [faun'deiʃən] n. 基础;地基;基金会;根据;创立}微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分。它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面。

  作用: 具体可以看看官网或者去百科看看

Eg:

后台代码

复制代码
/*
 * 
 * 第 34章 Windows Presentation Foundation 
 * 
 */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;

//添加对程序集WindowsBase、PresentationCore和 PresentationFramework的引用
namespace _5ConsoleApplication1
{
    class Program
    {
        //STAThread:Single     Thread     Apartment Thread.(单一线程单元线程)
        //[]是用来表示Attributes;
        //是一种线程模型,用在程序的入口方法上(在C#和VB.NET里是Main()方法),来指定当前线程的ApartmentState 是STA。用在其他方法上不产生影响。在aspx页面上可以使用AspCompat = "true" 来达到同样的效果。这个属性只在  Com  Interop  有用,如果全部是  managed  code  则无用。简单的说法:[STAThread]指示应用程序的默认线程模型是单线程单元 (STA)。启动线程模型可设置为单线程单元或多线程单元。如果未对其进行设置,则该线程不被初始化。也就是说如果你用的.NET Framework,并且没有使用COM Interop,一般不需要这个Attribute。其它的还有MTA(多线程套间)、Free  Thread(自由线程)
        [STAThread]
        static void Main(string[] args)
        {
            Window mainWindow = new Window();
            Canvas canvas = new Canvas();// ['kænvəs] n. 帆布vt. 用帆布覆盖,用帆布装备
            mainWindow.Content = canvas;
            mainWindow.Title = "WPF Application";
            Button button1 = new Button();
            canvas.Children.Add(button1);
            //WPF元素也可以从父元素中获得特性。例如,如果 Button元素位于 Canvas元素中,按钮的 Top
            //和Left属性把父元素的名称作为前缀。这种属性称为附带属性: 
            Canvas.SetLeft(button1, 140);
            Canvas.SetTop(button1, 130);
            button1.Content = "Click me!";
            //mainWindow.Content = button1; 
            button1.Click += (sender, e) => MessageBox.Show("Button clicked");
            Application app = new Application();// Application类的Run()方法负责处理 Windows消息。
            app.Run(mainWindow);
        }
    }
}
复制代码

运行结果:

  

猛地一看和WinForm的区别还真看不出来……

 

 

再贴一个前台代码

复制代码
<Window x:Class="_6WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        
    </Grid>
</Window>
复制代码

 

 

 

2.看看代码大致可以总结出以下几点区别

1、WPF的一个主要特性是设计人员和开发人员的工作很容易分开。设计人员的工作成果可以直接供开发人员使用。 设计人员可以使用Expression Blend工具,开发人员则使用Visual Studio 2008【前提是必须理解XAML】

  XAML:XML for Applications Markup Language(XAML)  用于定义用户界面的层次结构

2、WPF的编程非常类似于Window窗体的编程,其区别是按钮有 Content属性,而不是Text属性

3、命名空间:

    Windows窗体类位于 System.Windows.Forms命名空间

    WPF类位于 System.Windows命名空间及其子命名空间中 

 

 4、Windows窗体控件基于Windows内置控件,利用了基于屏幕像素的Windows句柄。而WPF基于DirectX。应用程序不再使用Windows句柄,更便于重新设置 UI的大小,并内置了音频和视频的支持。

 

5、WPF,WinForm :萝卜青菜各有所爱

 

革命尚未成功,如果想有所造诣还得继续啃书+练习 我这里只是记录我的学习笔记。。。祝你成功

 

复制代码
<Window x:Class="_6WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="想有所造诣还得继续前进" Height="300" Width="300">
        <Canvas> 
            <Ellipse  Canvas.Left="50"  Canvas.Top="50"  Width="100"  Height="100" 
            Stroke="Blue" StrokeThickness="4" Fill="Yellow" /> 
            <Ellipse Canvas.Left="60" Canvas.Top="65" Width="25" Height="25" 
            Stroke="Blue" StrokeThickness="3" Fill="White" /> 
            <Ellipse Canvas.Left="70" Canvas.Top="75" Width="5" Height="5" 
            Fill="Black" /> 
            <Path Stroke="Blue" StrokeThickness="4" Data="M 62,125 Q 95,122 
            102,108" /> 
            <Line X1="124" X2="132" Y1="144" Y2="166" Stroke="Blue" 
            StrokeThickness="4" /> 
            <Line X1="114" X2="133" Y1="169" Y2="166" Stroke="Blue" 
            StrokeThickness="4" /> 
            <Line X1="92" X2="82" Y1="146" Y2="168" Stroke="Blue" 
            StrokeThickness="4" /> 
            <Line X1="68" X2="83" Y1="160" Y2="168" Stroke="Blue" 
            StrokeThickness="4" /> 
        </Canvas> 
</Window>
转自:http://www.cnblogs.com/PEPE/archive/2012/08/10/2631777.html
<think>首先,用户的问题是关于C#WPFWinForm的对比、使用方法、特点等相关信息。我需要参考提供的站内引用来回答问题。 回顾提供的引用: - 引用[1]:讨论了WPFWinForms的区别。WPF更现代、灵活,适合复杂图形和交互的应用程序;WinForms适合快速开发简单应用或与旧代码库集成。还提到了.NET Core和.NET 5/6对WPF的支持。最后问到了性能和引用标识。 - 引用[2]:展示了在WPF中嵌入WinForms控件的示例代码,使用了WindowsFormsHost。 - 引用[3]:提供了C# WinForms应用中处理多用户切换的代码,使用了Mutex来防止多实例运行。 用户说这些引用仅供参考,不是真正的需求,应该参考上一次的问题和我的回答。但在这个对话中,用户是首次提问关于WPFWinForm的信息,所以这可能就是第一次交互。用户说:“我想了解C#WPFWinForm的相关信息 请问C#WPFWinForm的对比、使用方法、特点等相关信息”,所以我需要直接回答这个问题。 系统级指令要求: 1. 所有行内数学表达式必须使用$...$格式。但这个问题是关于编程的,可能没有数学表达式,所以我需要注意如果有的话。 2. 独立公式使用$$...$$并单独成段。 3. LaTeX语法正确。 4. 使用中文回答。 5. 生成相关问题。 6. 回答中引用的段落末尾自然地添加引用标识,如[^1]。 回答结构:系统示例显示有标题(如“快速排序”),然后是内容,代码块(如果有),最后是相关问题。所以我会采用类似结构。 内容主题:对比WPFWinForm。 关键点从引用[1]: - WPF:现代、灵活,适合复杂图形和交互应用。 - WinForms:快速开发简单应用,或在旧代码库集成时使用。 - .NET支持:WPF在.NET Core/5/6中仍有竞争力。 其他引用: - 引用[2]:如何在WPF中嵌入WinForms控件,使用WindowsFormsHost。这可以作为一种使用方法。 - 引用[3]:WinForms中防止多实例运行的代码。这可能展示WinForms的特点。 我需要基于这些构建一个综合回答。 大纲回答: 1. **介绍**:简述WPFWinForm。 2. **对比**:从开发方式、UI设计、性能、适用场景等方面对比。 - WinForms:基于事件驱动,拖拽式设计,简单高效。 - WPF:基于XAML,分离UI和逻辑,支持高级图形(如3D、动画)。 3. **特点**: - WinForms:成熟、稳定,组件丰富。 - WPF:数据绑定、模板、矢量图形等。 4. **使用方法**: - 如何创建项目:在Visual Studio中选择模板。 - 互操作性:例如,在WPF中嵌入WinForms控件(参考引用[2])。 - 代码示例:展示简单的WinForms和WPF代码。 5. **性能**:引用[1]中提到性能区别,WPF可能有更高的开销但更灵活。 6. **引用标识**:在相关内容末尾添加引用,如[^1]。 最后,生成相关问题。 确保使用中文。 生成相关问题: - 类似系统示例:如“如何优化WPF性能?”、“WPFWinForm的优缺点总结?”、“如何在.NET Core中使用WPF?” 现在,构建回答。 </think>以下是针对您查询的C#WPF(Windows Presentation Foundation)和WinForms(Windows Forms)的详细解答。我将从两者的核心对比、特点、使用方法等方面逐步解析,确保内容清晰可靠。回答基于提供的站内引用和C#开发实践,相关引用段落末尾会自然添加标识(如[^1])。 ### 一、WPFWinForms的核心对比 WPFWinForms都是C#中构建桌面应用程序的框架,但设计和适用场景有显著差异。以下是关键对比点: 1. **开发方式和UI设计**: - **WinForms**:基于事件驱动模型,使用拖拽式设计器(如Visual Studio的工具箱),开发者可以快速添加控件(如按钮、文本框)。UI逻辑与代码紧密耦合,适合简单应用开发,上手容易。 - **WPF**:基于XAML(eXtensible Application Markup Language)声明式语言,实现UI与业务逻辑的分离(MVVM模式)。支持矢量图形、动画、3D渲染等高级特性,适合构建富交互和视觉复杂的应用[^1]。 - **性能对比**:WPF由于支持高级图形和硬件加速,可能在资源密集型场景(如大量动画)中有更高开销,但在现代硬件上通常足够高效;WinForms轻量级,启动快,适合资源受限环境[^1]。 2. **适用场景**: - **WinForms**:最适合快速开发小型桌面应用(如工具软件、数据录入界面),或在需要兼容旧系统(如.NET Framework遗留项目)时使用。例如,引用中的多用户切换示例展示了WinForms的事件处理机制[^3]。 - **WPF**:理想用于现代应用,如Kiosk系统、媒体播放器或企业级仪表盘,利用其数据绑定、模板和样式化能力提升用户体验。随着.NET Core和.NET 5/6的演进,WPF的跨平台支持增强,在现代开发中保持竞争力[^1]。 3. **兼容性和生态系统**: - **WinForms**:成熟稳定,拥有丰富的第三方控件库,但UI定制性有限(基于像素单位)。 - **WPF**:灵活度高支持响应式设计,但学习曲线较陡峭。二者可通过互操作集成,例如在WPF中嵌入WinForms控件以实现兼容(如引用中的`WindowsFormsHost`示例)[^2]。 ### 二、特点和优势总结 | 方面 | WinForms | WPF | |------------------|--------------------------------------------------------------------------|------------------------------------------------------------------------------------------| | **UI设计** | 简单拖拽式,基于像素单位,适合快速原型 | XAML声明式,支持矢量图形和数据绑定,便于主题定制 | | **开发效率** | 高(事件驱动代码少) | 中高(需学习XAML和MVVM),但长期项目更易维护 | | **图形能力** | 有限(GDI+绘图),适合2D基础UI | 强大(DirectX支持),支持动画、3D、多媒体 | | **兼容性** | 完美兼容旧.NET Framework项目 | 在.NET Core/5/6中优化,但可能需要额外配置 | | **性能** | 轻量级,启动快 | 资源消耗较高,但硬件加速可优化 | | **适用项目** | 简单工具、遗留系统集成 | 复杂交互应用、触摸屏界面、可定制主题软件 | ### 三、使用方法和代码示例 #### 1. **创建项目** - **WinForms**:在Visual Studio中,选择“Windows Forms App (.NET Framework/.NET Core)”模板。拖拽控件后,双击自动生成事件处理代码。 ```csharp // WinForms简单示例:按钮点击事件 using System.Windows.Forms; public class MainForm : Form { public MainForm() { Button btn = new Button { Text = "Click Me" }; btn.Click += (sender, e) => MessageBox.Show("WinForms clicked!"); Controls.Add(btn); } } ``` - **WPF**:选择“WPF App (.NET Core)”模板。使用XAML定义UI,C#处理逻辑。 ```xaml <!-- MainWindow.xaml --> <Window x:Class="WpfApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="WPF Example" Height="200" Width="300"> <StackPanel> <Button Content="Click Me" Click="Button_Click"/> </StackPanel> </Window> ``` ```csharp // MainWindow.xaml.cs public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void Button_Click(object sender, RoutedEventArgs e) { MessageBox.Show("WPF clicked!"); } } ``` #### 2. **互操作:在WPF中嵌入WinForms控件** WPFWinForms可以混合使用。例如,引用[2]展示了通过`WindowsFormsHost`嵌入WinForms按钮: ```xaml <Window xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" xmlns:local="clr-namespace:YourNamespace"> <Grid> <WindowsFormsHost Name="wfhHost2" Width="200" Height="100"> <wf:Button Text="My button 2"/> </WindowsFormsHost> </Grid> </Window> ``` 此方法适用于迁移旧项目或使用特定WinForms控件[^2]。 #### 3. **高级用法:多实例处理(WinForms示例)** 引用[3]演示了WinForms中防止多实例运行的Mutex机制,确保应用程序单例运行: ```csharp using System; using System.Threading; using System.Windows.Forms; namespace WindowsFormsApp1 { static class Program { static bool ownsMutex = false; static readonly Mutex myMutex = new Mutex(false, @"Local\myApp"); [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); try { ownsMutex = myMutex.WaitOne(0); } catch (AbandonedMutexException) { ownsMutex = true; } if (!ownsMutex) { MessageBox.Show("myApp is already running!", "Multiple Instances"); return; } else { try { Application.Run(new Form1()); } finally { myMutex.ReleaseMutex(); } } } } } ``` 此代码适用于WinForms应用程序的启动优化[^3]。 ### 四、建议和最佳实践 - **选择框架**:简单应用优先WinForms;复杂、定制化需求选择WPF。 - **性能优化**:WPF中使用虚拟化列表减少渲染负载;WinForms避免频繁重绘控件。 - **现代开发**:在.NET 5/6中,WPF拥有更好的跨平台支持,推荐新项目采用以利用最新特性[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值