存档在 ‘.NET开发’ 分类中.

术有专攻 日益精进

这是周靖老师在其所译的著作《C#本质论》(英文名《Essential C# 2.0》)的译者序所使用的题目。在序中,有一段话很好,特摘录于此,共勉之!
—————————————————
最近在看《史记 孔子世家》,撷取孔子学琴一则与各位共勉:
孔子学鼓琴师襄子,十日不进。师襄子曰:“可以益矣。”孔子曰:“丘已习其曲矣,未得其数也。”有间,曰:“已习其数,可以益矣。”孔子曰:“丘未得其志也。”有间,曰:“已习其志,可以益矣。”孔子曰:“丘未得其为人也。”有间,有所穆然深思焉。曰:“丘得其为人,黯然而黑,几然而长,眼如望羊,如王四国,非文王其谁能为此也!”师襄子辟席再拜,曰:“师盖云文王操也。”
这则故事的大意为孔子向师襄子学琴,学了十天并不要求学习新的东西。尽管师襄子一再敦促可以增加新的内容,但孔子坚信,不达到三个境界,不能继续学习新的东西:学习常握演奏的技巧,领会其中的志趣,熟悉乐曲的作者。最终,孔子领悟到乐曲作者的心境,使师襄子叹服不已。
每学习一种新东西,都离不开这三个境界,正所谓“昨夜西风凋碧树,独上高楼,望尽天涯路”,此境界一也;“衣带渐宽终不悔,为伊消得人憔悴”,此境界二也;“众里寻他千百度,回头蓦见,那人正在,灯火阑珊处”,此境界三也。
从事技术图书的翻译多年,经常有读者来信问:“我想学习编程,如何入手?”对待这种问题,我往往会勉励他们,万丈高楼平地起,首先要搭建好整个学习框架,梳理整个学习层次,然后选择合适的入门书夯实基础,完全掌握之后再按照已经搭建好的框架逐一填充各个学习模块。
……

标签: 

使用WPF创建Office 2007功能区风格的自定义面板

Technorati 标签: ,,,

WPF,Windows Presentation Foundation,是Microsoft在.NET 3.0中引入的新组件,提供了表现层技术基础,用于统一处理用户界面和可视化元素。WPF的出现,使得用户开发具有震撼力的用户界面体验更加轻松和可能。同时,WPF是基于XAML(可扩展应用程序标记语言)来定义界面元素的。

下面是《Windows Presentation Foundation Unleashed》一书中使用WPF技术创建仿Office 2007 功能区的自定义面板的示例,所实现的结果如下图所示:

getRibbonCustomPanelpic

同时,记录下部分代码:

   1: Imports System
   2: Imports System.Windows
   3: Imports System.Windows.Controls
   4:  
   5: Namespace CustomPanel
   6:     Public Class RibbonPanel
   7:      Inherits Panel
   8:         Protected Overrides Function MeasureOverride(ByVal availableSize As Size) As Size
   9:             If Children.Count < 1 Then
  10:                  Return New Size(0, 0)
  11:             End If
  12:  
  13:             ‘ Ask the first child for its desired size, given unlimited space
  14:             Dim firstChild As UIElement =  Children(0) 
  15:             firstChild.Measure(New Size(Double.PositiveInfinity,Double.PositiveInfinity))
  16:  
  17:             ‘ If there’s only one child, this panel would like to be the exact same size
  18:             If Children.Count < 2 Then
  19:                  Return firstChild.DesiredSize
  20:             End If
  21:  
  22:             ‘ If not, calculate the desired width based on all children
  23:             Dim numRows As Double =  Math.Ceiling((Children.Count - 1) / 3d) 
  24:             Dim maxWidthForEachRemainingChild As Double =  0 
  25:  
  26:             Dim i As Integer
  27:             For  i = 1 To  Children.Count- 1  Step  i + 1
  28:                 ‘ Ask each child for its desired size, given unlimited space
  29:                 Dim child As UIElement =  Children(i) 
  30:                 child.Measure(New Size(Double.PositiveInfinity,Double.PositiveInfinity))
  31:  
  32:                 ‘ Keep track of the maximum width
  33:                 maxWidthForEachRemainingChild = Math.Max(child.DesiredSize.Width, maxWidthForEachRemainingChild)
  34:             Next
  35:  
  36:             Return New Size(
  37:                 firstChild.DesiredSize.Width + maxWidthForEachRemainingChild * numRows, ‘ total width
  38:                 Dim ‘ height = desired height of the first child As firstChild.DesiredSize.Height)
  39:         End Function
  40:  
  41:         Protected Overrides Function ArrangeOverride(ByVal finalSize As Size) As Size
  42:             If Children.Count < 1 Then
  43:                  Return finalSize
  44:             End If
  45:  
  46:             ‘ Give the first child its desired width but the height of the panel
  47:             Dim firstChild As UIElement =  Children(0) 
  48:             Dim childOrigin As Point =  New Point(0,0) 
  49:             Dim firstChildSize As Size =  New Size(firstChild.DesiredSize.Width,finalSize.Height) 
  50:             firstChild.Arrange(New Rect(childOrigin,firstChildSize))
  51:  
  52:             If Children.Count < 2 Then
  53:                  Return finalSize
  54:             End If
  55:  
  56:             ‘ Determine the size for all the remaining children
  57:             Dim numRows As Double =  Math.Ceiling((Children.Count - 1) / 3d) 
  58:             Dim childSize As Size =  New Size((finalSize.Width - firstChildSize.Width) / numRows,finalSize.Height / 3) 
  59:             childOrigin.X += firstChildSize.Width
  60:  
  61:             Dim i As Integer
  62:             For  i = 1 To  Children.Count- 1  Step  i + 1
  63:                 Dim child As UIElement =  Children(i) 
  64:                 child.Arrange(New Rect(childOrigin,childSize))
  65:  
  66:                 If i % 3 = 0 Then
  67:                     ‘ Start a new column
  68:                     childOrigin.X += childSize.Width
  69:                     childOrigin.Y = 0
  70:                 Else 
  71:                     childOrigin.Y += childSize.Height
  72:                 End If
  73:             Next
  74:  
  75:             ‘ Fill all the space given
  76:             Return finalSize
  77:         End Function
  78:     End Class
  79: End Namespace
标签: 没有标签

使用Visual Studio 2005编写Excel自定义函数

步骤1:打开Visual Studio 2005,单击菜单“文件”─—“新建项目”。
步骤2:在“新建项目”对话框中,选择“Windows”节点中的“类库”,并输入名称,如下图。单击“确定”,创建一个类库项目。
dotnetexcelfunctions1
步骤3:在Class1.vb代码窗口中,输入下面的代码:

Imports System
Imports System.Runtime.InteropServices
Imports Microsoft.Win32

<ClassInterface(ClassInterfaceType.AutoDual), ComVisible(True)> _
Public Class TestFunction

    Public Function fff() As Long
        Dim result As Long
        result = 12345
        Return result
    End Function

    <ComRegisterFunctionAttribute()> _
            Public Shared Sub RegisterFunction(ByVal type As Type)
        Registry.ClassesRoot.CreateSubKey(GetSubKeyName(type))
    End Sub

    <ComUnregisterFunctionAttribute()> _
    Public Shared Sub UnregisterFunction(ByVal type As Type)
        Registry.ClassesRoot.DeleteSubKey(GetSubKeyName(type), False)
    End Sub

    Private Shared Function GetSubKeyName(ByVal type As Type) As String
        Dim s As String = “CLSID\{” + type.GUID.ToString().ToUpper() + “}\Programmable”
        Return s
    End Function

End Class

步骤4:单击菜单“项目”─—“TestMyFunctions属性”。
步骤5:选择“编译”选项卡,选中“为COM Interop注册”前的复选框,如下图。
dotnetexcelfunctions2
步骤6:单击菜单“生成”─—“生成TestMyFunctions”。
步骤7:保存该项目,然后退出Visual Studio 2005。
步骤8:启动Excel 2003。
步骤9:单击菜单“工具”─—“加载宏”。
步骤10:在“加载宏”对话框中,单击其右侧的“自动化”按钮。
步骤11:在“自动化服务器”对话框的列表中,找到“TestMyFunctions.TestMyFunction”并选中,然后单击“确定”,如下图。
dotnetexcelfunctions3
步骤12:此时,在“加载宏”对话框中,添加了“TestMyFunctions.TestMyFunction”项,如下图,单击“确定”。
dotnetexcelfunctions4
步骤13:在Excel工作表单元格中,按普通的公式方输入“=fff()”,按回车后得到结果“12345”。
此时,在Excel的“插入函数”对话框中,添加了一个新类别“TestMyFunctions.TestMyFunction”,其中包括自定义的函数fff,如下图。
dotnetexcelfunctions5

VSTO3.0:用Visual Studio 2008开发Office业务应用程序

技术正在飞速发展,还记得似乎Microsoft才推出Visual Studio 2005不久,而今又推出了Visual Studio 2008,更新得如此之快,让人真的是有点不知所措。
下面是最新一期《MSDN Magazine》——Launch 2008上一篇关于VSTO 3.0的文章。在这里,只给出了文章的链接和主要介绍,以及我感兴趣的内容。
文章链接:http://msdn.microsoft.com/msdnmag/issues/08/LA/ExtendingOutlookWithVS08/default.aspx?loc=zh
主要内容:

  • Visual Studio 2008 新增功能
  • 为 Outlook 创建自定义窗体区域
  • 连接数据源
  • 添加搜索功能

一些内容:

  • 到目前为止,我敢确定您已经听说了一些有关 Visual Studio® 2008 的趣闻,它具有一些强大的功能,如支持 LINQ、改进了 Web 开发以及与 Windows Vista® 和 SharePoint® 紧密集成等等。不过 Visual Studio 2008 真正突出的一个特点是支持 Microsoft® Office 解决方案开发。
    您也可下载 VSTO Second Edition 开发 Office 2003 应用程序和 2007 Microsoft Office 系统的解决方案。但是,在 Visual Studio 2008 中包含了所有的 VSTO 项目模板。
标签: 没有标签

VSTO如何与Visual Studio相结合

当使用VSTO创建Word或Excel解决方案时,可以直接从Visual Studio里与Word或Excel应用程序相交互。这是因为VSTO与Visual Studio已整合在一起。
Word和Excel作为设计器
在已经创建新的Excel或Word文档或模板项目后,该文档在Visual Studio环境里作为设计器是可用的。事实上,整个应用程序在Visual Studio里是可用的。
设计器是正创建的应用程序的用户接口的容器。例如,如果在Word VBA解决方案里创建用户窗体,VBE为应用程序显示该用户窗体作为设计器。然后,可以添加控件到用户窗体。当使用VSTO创建解决方案时,同样的经历现在可用于Word和Excel解决方案中。该文档是一个设计器,可以从工具箱中拖动控件在其中。
能够在设计器中添加两种类型的控件:Windows Forms控件和宿主控件。
设计器是该应用程序的可见的表现,每个设计器与代码文件相关联(正如先前提到的,该代码有时被称为代码后台的文件)。可以使用一些方法从设计器视图切换到代码视图。一种方式是在文档中单击右键,然后在快捷菜单中单击查看代码。
当在代码视图中时,可以右键单击代码编辑器,并从快捷菜单中选择查看设计器,在Visual Studio里打开该设计器。也可以在解决方案管理器中右击代码文件,打开快捷菜单,会提供相看代码和相看设计器选项。
viewdesigner
图:从代码编辑器切换到设计器
在VSTO里的代码文件
当创建新的VSTO解决方案时,Visual Studio创建许多文件。例如,如果在Visual Studio里
resourcemanagement
图:当选择显示所有文件时在解决方案管理器中显示的文件
在ThisDocument.vb源文件中编写代码。该文件包含ThisDocument类,有两个事件句柄(ThisDocument_Startup和ThisDocument_Shutdown)。可以在写字板里打开这个文件查看其内容。当然,不能使用写字板添加代码到文件中。ThisDocument.vb文件对Visual Studio里的文件有用。可以在解决方案管理器中右击该文件,选择查看代码。
这里,可以使用Visual Studio IDE的所有丰富的功能,包括IntelliSense和调试工具来使用代码任务更容易。在ThisDocument.vb后面有一些额外的文件,包含VSTO自动产生的代码。这些文件是ThisDocument.Designer.xml和ThisDocument.Designer.vb。