七月 5

wpf笔记之xmal里面的Name和x:Name有什么区别

经常会有初学者问:在XAML代码中是应该使用Name呢,还是x:Name?

Name属性定义在FrameworkElement类中,这个类是WPF控件的基类,所以所有WPF控件都具有Name这个属性。当一个元素具有Name属性时,你使用Name或x:Name效果是一样的。比如<Buton x:Name=”btn”/>和<Buton Name=”btn”/>,XAML编译器的动作都是声明名为btn的Button类型变量并引用一个Button 类型实例,而且此实例的Name属性值亦为btn。此时,Name和x:Name是可以互换的,只是不能同时出现在一个元素中。

对于那些没有Name属性的元素,为了在XAML声明时也创建引用变量以便在C#代码中访问,我们就只能使用x:Name。有的编程者认为,因为x:Name的功能涵盖了Name属性的功能,所以全部使用x:Name以增强代码的统一性和可读性。但是安静还是认为,由于绝大多数代码都可以直接使用Name,那么和何乐而不为呢?只是在不能是用Name的时候,使用x:Name就好了。

七月 5

WPF编程中Property和Attribute的区别

在中文中,Property和Attribute都被翻译为属性。但是这两个单词真的是一个意思吗?今天,我们就来比较一下在WPF中这两个定义的区别.

Property属于面向对象理论范畴。在使用面向对象思想编程的时候,常常需要对客观事物进行抽象,再把抽象出来的结果封装成类,类中用来表示事物状态的成员就是Property。比如要写一个模拟赛车的游戏,那么必不可少的就是对现实汽车的抽象。现实中的汽车身上会带有很多数据,但在游戏中可能只关心它的长度、宽度、高度、重量、速度等有限的几个数据,同时,还会把汽车“加速”、“减速”等一些行为也提取出来并用算法模拟,这个过程就是抽象(结果是Car这个类)。显然,Car.Length、Car.Height、Car.Speed等表达的是汽车当前处在一个什么状态,而Car.Accelerate()、Car.Break()这些则是表达的是汽车能做什么。因此,Car.Length、Car.Height、Car.Speed就是Property的典型代表,将Property译为“属性”也很贴切。总结一句话就是:Property(属性)是针对对象而言的。

Attribute则是编程语言文法层面的东西。比如有两个同类的语法元素A和B,为了表示A与B不完全相同或者A与B在用法上有些区别,这时候就要针对A和B加一些Attribute。也就是说,Attribute只与语言层面上的东西相关,与抽象出来的对象没什么关系。因为Attribute是为了表示“区分”的,所以把它译为“特征”。C#中的Atribute就是这种应用的典型例子,我们可以为一个类添加Attribute,这个类的类成员中有很多Property。显然Attribute只是用来影响类在程序中的用法,而Property则对应着抽象对象身上的性状,它们根本不是一个层面上的东西。

习惯上,英文中把标签式语言中表示一个标签特征的“名称-值”对称作Attribute。如果恰好又是用一种标签语言在进行面向对象编程,这时候两个概念就有可能混淆在一起了。实际上,使用能够进行面向对象编程的标签式语言只是把标签与对象做了一个映射,同时把标签的Attribute与对象的Property也做了一个映射针对标签还是叫Attribute,针对对象还是叫Property,仍然不是一个层面上的东西。而且,标签的Attribute与对象的Property.也不是完全映射的,往往是一个标签所具有的Attribute多于它所代表的对象的Property。

因为XAML是用来在UI上绘制控件的,而控件本身就是面向对象抽象的产物,所以XAML标签的Attribute里就有一大部分是与控件对象的Property互相对应的。当然,这还意味着XAML标签还有一些Attribute并不对应控件对象的Property。

如果上面的解释您还不够明白,可以这样理解:针对标签的属性就是Attribute,针对类的的属性就是Property。他们直接有些地方是一样的,但并不是完全对应的。

七月 2

WPF笔记之XAML基础笔记

  1. XAML中只能有一个顶级元素。常用的顶级元素:Window,Page,Application。
  2. XAML中有属性和事件。其中附加属性指的是调用别的类的属性。例如,我们设置某个按键所属于的Grid的RowDefinition。此处的Grid.Row虽然是Grid的属性,然而我们却需要在Button中进行定义。这样的属性就叫做附加属性。
  3. 属性的定义可以直接定义,也可以通过属性元素定义。一般只有比较复杂的情况下才选择属性元素的方法定义。直接定义更加简单直观。
  4. 在XAML中小于号<用&lt表示(个人估计lt的意思是less than),类似,在XAML中大于号>用&gt表示(估计gt是greater than的意思)。
  5. XAML中无论几个空格都会自动识别为一个。如果想要保留原来的空格数量,需要设置属性xml:space = “preserve”。
七月 1

TrueGrid的基本操作

一、文件保存

TrueGrid可以将执行过的命令行保存到tsave文件中。但是tsave文件只有一个,因此如果要保留文件的执行过程,需要将tsave文件重命名进行保存。否则tsave文件会在下次运行TrueGrid的时候被覆盖。命令行文件中的命令可以进行手动修改,并可以使用Fortran中的If ElseIf Else EndIf等命令进行流程化的编辑。此外,以c开头的命令行表示注释。

二、文件输出

由于不同的有限元求解器有不同的文件格式。因此我们需要在输出解算文件前指定输出文件的格式。这一步是在Control Phase中进行的。输出的文件名默认为trugrdo。

在Control Phase中点击Output按钮,然后在转换到Merge Phase在命令行中输入write命令,就可以输出指定的输出文件。输出文件默认保存在C:\TrueGrid\Examples文件夹中。

三、命令行的复制粘贴

和一般的Windows程序不同,TrueGrid的复制粘贴使用的是鼠标中键。在使用鼠标左键选中要复制的内容后,点击鼠标中键即可复制。在需要粘贴的位置再次点击鼠标中键即可粘贴。

四、两种命令提示

:(英文冒号)表示需要输入一个数字。

>(英文尖括号)表示需要输入一串字符。

五、TrueGrid常用快捷键

TureGrid 提供了一些常用的快捷键,常用快捷键的功能如下:

F1:将选择区域输入到对话框;

F2:清除选择;

F3:在文本窗口显示命令记录;

F4:锁定现有的窗口设置;

F5:选择网格的起始节点;

F6:选择网格的终止节点;

F7:提取选定节点的坐标;

F8:改变文本窗口或对话窗口的标签选取类型;

六、其他

如果菜单目录不见了,在命令窗体中敲回车即可出现。

七月 1

TrueGrid中的Physical物理网格以及Computation计算网格

物理网格Physical就是我们画出来的网格。这个非常容易理解,在其有限元前处理器中所提到的网格,都是物理网格Physical。

而计算网格Computational则比较特殊一些。简单的说,计算网格Computational就是把物理网格Physical分成了几个区,而计算网格Computational的坐标,就是对应的区域的坐标,也被称作索引Index。由于计算网格Computational以及其对应坐标索引Index是TrueGrid中比较特有的一种形式,我们在这里多做一些讲解。

索引Index:

索引Index是计算空间Computational中的坐标,也就是物理网格Physical所属的区域的代号。索引Index分为I,J和K三个方向,分别对应X,Y以及Z方向。使用索引Index不仅可以灵活的选择节点,也可以利用索引Index来创建网格。

简单索引:用于网格初始化

首先我们来试着理解一个命令:

block 1 6 9 13 18; 1 5;1 4 8;1 5 10 15 20;0 5;0 5 10; 在这个命令中block是指建立一个立方体的网格块。

block 1 6 9 13 18; 1 5;1 4 8;1 5 10 15 20;0 5;0 5 10; 加黑的部分表示:在I方向上索引Index为1的区块开始于第1个节点,索引Index为2的区域开始于第6个节点,索引Index为3的区域开始于第9个节点,索引Index为4的区域开始于第13个节点,索引Index为5的区域开始于第18个节点。后面的两个区块分别对应J方向和K方向,但是原理是一样的。

block 1 6 9 13 18; 1 5;1 4 8;1 5 10 15 20;0 5;0 5 10; 加黑的部分表示每个区域开始节点的坐标位置。

进阶索引:用于选择网格

例如:1 2; 1 2; 2 3这个进阶索引所选中的,就是索引Index在I方向为1-2之间,在J方向为1-2之间,在K方向在2-3之间的区域。需要注意的是,这里的数字指的是索引,即网格对应的区域的编号,并不是网格的编号。

0索引:用于打断进阶索引

0索引之前和之后的区域不连续。例如1 2 0 3 4; 1 2; 2 3这里的索引Index在I方向上就被打断成索引Index为1-2的区域和索引Index为3-4的区域。而中间Index的索引为2-3的区域则不会被选中。

负索引:用于表示退阶,即体退阶为面,面退阶为线。

范例:

block -1 5 9;-1 5 9;-1 5 9;-1 0 1;-1 0 1;-3 0 1; 这里索引Index中的-1指的就是在1位置形成的是一个面。而随后的5 9则表示从5到9的节点位置之间为一个体。上述命令的执行结果如下图所示:

Index负索引案例

关于索引,我们就先介绍这么多。这些知识有一些比较难以理解。希望大家多看几遍。

六月 29

TrueGrid的Control Phase,Part Phase 和Merge Phase 分别是什么

TrueGrid一共分为三个阶段,分别为Control Phase, Part Phase和Merge Phase。可以从窗体左上角的标题上判断处在哪个阶段。如下图所示:

TrueGrid

Control Phase:直接翻译过来就是控制阶段。这一阶段就是输入模型的控制参数:例如材料参数,输出参数等。刚打开TrueGrid时,默认进入的就是Control Phase。这一阶段是不能运用图形功能能的。这一点很好理解,因为需要设置的这些参数都是独立于几何形状或者网格模型的。

Part Phase: 翻译过来大体上可以理解为建模阶段。这一阶段的主要作用为创建几何模型以及生成网格模型。我们在计算过程中最终需要的是网格模型,而生成几何模型的最终目的也是获得网格模型。该阶段屏幕上会同时存在三个窗口:Computational计算窗口,Physical物理窗口以及Environment环境窗口。这三个窗口分别的作用我们在后面会仔细讲到。目前大家只需要知道在Part Phase屏幕上有着三个窗口就可以了。

Merge Phase: 这一阶段可以理解为装配阶段。我们在这一节点通过合并节点等方式将在Part Phase得到的网格模型进行装配。在这一阶段有Physical物理窗口和Environment环境窗口两个窗口。和Part Phase相比,少了Computational计算窗口。除了合并网格,我们在这一阶段还可以施加载荷和边界条件,进行网格质量检查等。总是,这一步是为了输出计算模型做最后的准备。

二月 5

Unity3D中input.GetAxis的用法

input.GetAxis 用法:

GetAxis(“Mouse X”),

GetAxis(“Mouse Y”),

GetAxis(“Mouse ScrollWheel”),

GetAxis(“Vertical “),

GetAxis(“Horizontal “)

               GetAxis 是个方法,需要传参数,参数为string类型,参数如下:

           一:触屏类

                  1.Mouse X                       鼠标沿着屏幕X移动时触发

                  2.Mouse Y                       鼠标沿着屏幕Y移动时触发

                  3.Mouse ScrollWheel      当鼠标滚动轮滚动时触发

           二:键盘操作类

                  1.Vertical                        对应键盘上面的上下箭头,当按下上或下箭头时触发

                  2.Horizontal                    对应键盘上面的左右箭头,当按下左或右箭头时触发

一月 16

C#中如何将字符串string转换成枚举类型 – typeof()以及Enum.Parse()的用法

在C#中,我们有时会需要将字符串类型转换成枚举类型。此时我们无法使用显示转换,只能使用隐式转换。而我们需要用到的,就是Enum.Parse()方法。以下是这个方法的一个例子:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
//声明枚举类型
enum orientation : byte
{
north = 1,
south = 2,
east = 3,
west = 4
}
class Program
{
static void Main(string[] args)
{
//枚举使用一个基本类型来存储,枚举类型可以提取的每个值都存储为该基本类型的一个值,默认情况下该类型为int;
//枚举的基本类型可以是byte,sbyte,short,ushort,int,uint,long,ulong;
//调用枚举类型
orientation myDirection = orientation.north;
Console.WriteLine("myDirection={0}",myDirection);

//将string类型转换为枚举类型,typeof(orientation)将得到orientation的类型,Parse()将进行类型转换;
string myString = "north";
orientation myDirection2 = (orientation)Enum.Parse(typeof(orientation), myString);
Console.WriteLine("myDirection2={0}", myDirection2);
Console.ReadLine();
}
}
}

在这里需要注意的是,有一个typeof方法,这个方法返回的是数值的类型。要注意,枚举不是一个单独的类型,而使用枚举定义的特定枚举类型才是类型。