WPF与winform哪个比较好

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF与winform哪个比较好相关的知识,希望对你有一定的参考价值。

参考技术A winform很容易入手,wpf更先进,可以算是winform的升级版,但是学习阶梯很陡峭。一旦熟悉了wpf你将会很喜欢wpf并不想回到winform。 参考技术B WPF将Windows表示层发展至用声明式语言进行开发,并且融入大量的动画和特效,使得在Win32中极难做到的富客户端应用能在WPF中信手拈来,同时用矢量图取代位图,引入路由事件(RoutedEvent)对元素树进行多层监听,通过依赖属性(DependencyProperty)动态变更控件树等。在WinForm程序开发时,一旦涉及多线程操作,我们一般不可能没有见过InvalidOperationException这个异常。这个异常的出现多数情况是由于worker线程(子线程)修改主线程控件(或对象)的属性而导致的非法操作,当然这种做法也非每次都会失败,这主要取决于子线程想要操作的对象是不是线程安全的。
 WinForm控件提供了InvokeRequired属性来判断当前线程是不是创建此控件的线程。一旦控件创建完成,那么InvokeRequired的效率将会不错,且也能保证安全。不过若是目标控件尚未被创建(此时,虽然C#对象已经存在,不过其底层的窗口句柄仍旧为null),那么InvokeRequired则可能会耗费比较长的时间。(它会从下至上遍历整个控件树,直到找到一个可以承载此控件且已经实例化并被创建了的父控件,这种做法可以保证子控件将会与父控件在同一个线程上创建。找到合适的父控件之后,框架即可执行同样的检查,比较当前线程的ID和创建该父控件的线程的ID。)。若是框架无法找到任何一个已创建的父窗体,那么则需要找到一些其他类型的窗体。若在层次体系中无法找到可用的窗体,那么框架将开始寻找暂存窗体(parking window),暂存窗体让你不会被某些Win32 API奇怪的行为所干扰。简而言之,有些对窗体的修改(例如修改某些样式)需要销毁并重新创建该窗体。暂存窗体就是用来在父窗体被销毁并重新创建的过程中用来临时保存其中的控件的。在这段时间内,UI线程仅运行于暂存窗体中。
通常,WPF 应用程序从两个线程开始:一个用于处理呈现,一个用于管理 UI。呈现线程有效地隐藏在后台运行,而 UI 线程则接收输入、处理事件、绘制屏幕以及运行应用程序代码。
WPF为Windows Presentation Foundation的缩写 ,其原来代号为“Avalon”,因“我佩服”拼音首字母组合一样,国内有人调侃地称之为“我佩服”。WPF是微软新一代图形系统,运行在.NET Framework 3.0架构下,为用户界面、2D/3D 图形、文档和媒体提供了统一的描述和操作方法。基于DirectX 9/10技术的WPF不仅带来了前所未有的3D界面,而且其图形向量渲染引擎也大大改进了传统的2D界面,比如Vista中的半透明效果的窗体等都得益于WPF。 程序员在WPF的帮助下,要开发出媲美Mac程序的酷炫界面已不再是遥不可及的奢望。 WPF相对于Windows客户端的开发来说,向前跨出了巨大的一步,它提供了超丰富的.NET UI 框架,集成了矢量图形,丰富的流动文字支持flow text support,3D视觉效果和强大无比的控件模型框架。
参考技术C 要我说,肯定是WPF好了,呵呵,他毕竟是微软下一代的界面开发语言,而且现在已经很火了

c# winform 报表打印

c#开发winform系统,怎么做报表、表单的打印。
比较简单点的 用户可以自己设置打印表单的样式。

看到过fastreport这个的,但是这个在c#中集成不上。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ToExcelDemo

class ExportExcel

public static void ExportToExcel(System.Windows.Forms.DataGridView grdView)

int rowCount = grdView.Rows.Count;
int columnCount = grdView.Columns.Count;
if (rowCount == 0)

System.Windows.Forms.MessageBox.Show("没有数据可供导出...", "Prompt", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation);
return;

System.Windows.Forms.SaveFileDialog saveDlg = new System.Windows.Forms.SaveFileDialog();
saveDlg.Title = "导出文件保存路径";
saveDlg.Filter = "Excel files(*.xls)|*.xls";
saveDlg.FilterIndex = 0;
saveDlg.RestoreDirectory = true;
saveDlg.ShowDialog();
string fileName = saveDlg.FileName;
if (fileName.Length != 0)

System.Reflection.Missing miss = System.Reflection.Missing.Value;
Microsoft.Office.Interop.Excel.ApplicationClass excel = new Microsoft.Office.Interop.Excel.ApplicationClass();
excel.Application.Workbooks.Add(true);
excel.Visible = false;//若是true,则在导出的时候会显示EXcel界面

if (excel == null)

System.Windows.Forms.MessageBox.Show("Excel无法启动!", "Error", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
return;

Microsoft.Office.Interop.Excel.Workbooks workBooks = (Microsoft.Office.Interop.Excel.Workbooks)excel.Workbooks;
Microsoft.Office.Interop.Excel.Workbook workBook = (Microsoft.Office.Interop.Excel.Workbook)workBooks.Add(miss);
Microsoft.Office.Interop.Excel.Worksheet workSheet = (Microsoft.Office.Interop.Excel.Worksheet)workBook.ActiveSheet;
workSheet.Name = "Test";
excel.Cells[1, 1] = grdView.TopLeftHeaderCell.Value;
for (int i = 0; i < grdView.Columns.Count; i++)

excel.Cells[1, i + 2] = grdView.Columns[i].HeaderText.ToString();

for (int rowIndex = 0; rowIndex < rowCount; rowIndex++)

excel.Cells[rowIndex + 2, 1] = grdView.Rows[rowIndex].HeaderCell.Value.ToString();
for (int colIndex = 0; colIndex < columnCount; colIndex++)

excel.Cells[rowIndex + 2, colIndex + 2] = grdView[colIndex,rowIndex].Value.ToString();


try

workBook.SaveCopyAs(fileName);

catch (Exception ex)

System.Windows.Forms.MessageBox.Show(ex.Message);





我做过一个 看看能不能给你点启发
参考技术A using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
namespace
ToExcelDemo

class
ExportExcel

public
static
void
ExportToExcel(System.Windows.Forms.DataGridView
grdView)

int
rowCount
=
grdView.Rows.Count;
int
columnCount
=
grdView.Columns.Count;
if
(rowCount
==
0)

System.Windows.Forms.MessageBox.Show("没有数据可供导出...",
"Prompt",
System.Windows.Forms.MessageBoxButtons.OK,
System.Windows.Forms.MessageBoxIcon.Exclamation);
return;

System.Windows.Forms.SaveFileDialog
saveDlg
=
new
System.Windows.Forms.SaveFileDialog();
saveDlg.Title
=
"导出文件保存路径";
saveDlg.Filter
=
"Excel
files(*.xls)|*.xls";
saveDlg.FilterIndex
=
0;
saveDlg.RestoreDirectory
=
true;
saveDlg.ShowDialog();
string
fileName
=
saveDlg.FileName;
if
(fileName.Length
!=
0)

System.Reflection.Missing
miss
=
System.Reflection.Missing.Value;
Microsoft.Office.Interop.Excel.ApplicationClass
excel
=
new
Microsoft.Office.Interop.Excel.ApplicationClass();
excel.Application.Workbooks.Add(true);
excel.Visible
=
false;//若是true,则在导出的时候会显示EXcel界面
if
(excel
==
null)

System.Windows.Forms.MessageBox.Show("Excel无法启动!",
"Error",
System.Windows.Forms.MessageBoxButtons.OK,
System.Windows.Forms.MessageBoxIcon.Error);
return;

Microsoft.Office.Interop.Excel.Workbooks
workBooks
=
(Microsoft.Office.Interop.Excel.Workbooks)excel.Workbooks;
Microsoft.Office.Interop.Excel.Workbook
workBook
=
(Microso

以上是关于WPF与winform哪个比较好的主要内容,如果未能解决你的问题,请参考以下文章

用C#开发界面用winform好还是wpf好

c# winform 报表打印

winform与WPF有啥区别

MFC和Winform及WPF哪个更专业

devexpress与winform区别

winform调用wpf异常问题