内容控件

Content                                                                                                                                                                     

  内容控件只允许包含一项简单控件。就是说在设置内容控件的Content属性时只能设置一项,否则将出现以下错误。

  如果我们需要同时为Content属性添加多个项,可以使用容器把这些项包含起来。

例如我想在一个Label控件的Content属性中添加一句文本跟一张图片。

Content包含容器
1  <Label Target="{Binding ElementName=userNameBox}" Height="28" HorizontalAlignment="Left" Margin="12,43,0,0" Name="Label1" VerticalAlignment="Top" Width="120">
2                 <StackPanel >
3                     <Label Background="Black" FontWeight="Bold" Foreground="White">百度网站Logo</Label>
4                     <Image Source="http://www.baidu.com/img/baidu_logo.gif" Width="400" Height="300"></Image>
5                 </StackPanel>   
6 </Label>

 

 HasContent                                                                                                                                                                

  它是一个布尔类型的属性,但Content为空时为False否则为True。他通常结合属性触发器使用,利用它的变化来设置其他的值。

 

书中说WPF中自带的内容控件有3大类。(同时提到Windows其实也是一种内容控件,在以后会了解到)

 1.按钮
 2.简单容器
 3.带有头部(Header)的容器

 

 按钮在我们通常的理解中就是一个可以被点击、或者在按钮获得焦点时点击键盘回车键等按键操作的内容控件,在WPF中ButtonBase类定义了按钮的属性跟方法。
  直接继承ButtonBase类得到的控件有:
  *Button

     在ButtonBase的基础上添加了两个简单的属性isCancel跟IsDefault,isDefault为true时,这个按钮在默认情况下,此按钮获得焦点。isCancel书上说对于对话框来说是一种捷径,当按钮的isCancel为True时,点击按钮,对话框会自动关闭。这个我想不通,如果我没有设置isCancel属性,我直接在click事件中编写关闭对话框的逻辑就行了,可能在后面的学习中会慢慢明白吧。

 

   *RepeatButton
  在默认的工作箱(vs2008左边的工具箱)中没出现的,需要自己在Xaml代码中输入。
  外观上与button的外观一样,继承自ButtonBase
  它主要的功能是当鼠标按键不松开,根据Delay与Interval属性(单位均为毫秒)来运行Click事件。

 例如
xaml代码                                                                                       
...
<TextBox Height="23" name="txt">1</TextBox>
<RepeatButton Name="repbtn_add" Delay="1000" Interval="100" Width="34">+</RepeatButton>
<RepeatButton Name="repbtn_cut" Delay="1000" Interval="100" Width="34">-</RepeatButton>
...
                                                                                                

逻辑代码                                                                           
  Private Sub rebtn_up_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles rebtn_up.Click
        Me.TextBox1.Text += 1

    End Sub

    Private Sub rebtn_down_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles rebtn_down.Click
        Me.TextBox1.Text -= 1

    End Sub
                                                                                                
当鼠标点击 “+”按钮时,运行一次repbtn_add的click事件一次,如果鼠标不疏开,1秒钟之后就会按照每秒10次的频率运行repbtn_add的click事件。感觉TextBox的跳动频率
 
   从上面的例子可以知道RepeatButton的Delay属性控制鼠标点击后多么秒后按照Interval的频率运行click事件。

 

  *ToggleButton & CheckBox & RadioButton
  此类按钮是一种在点击是可以保留其状态的按钮,他们有3中状态,分别是选中(checked)、不确定(indeterminate)、未选中(unchecked)。跟传统的winform控件大同小异。 在RadioButton中用自定义方法(GroupName)来对选项进行分组,类型为字符串。

 

 

  简单容器

 *label
  label这个经典的控件跟以前一样,他的主要作用就是显示一些文字。在WPF中我们可以向Content属性中放入任何内容(Button、iamge等)。我们还可以设计Label显示文字的方式跟样式。

  在WPF中Label多了一个独特的特性,在winform中此特性我自己知道的就只存在于Menu菜单中。他就是访问键(access key),在一个字母钱增加一条下划线可以指派某个字母作为访问键.

<label>_label</label>

 

  当用户按下Alt+L时,控件将获得焦点。

 

 *ToolTip

 它效果就是将需要展示的内容放在一个浮动框中,鼠标悬停到那个设置了tooltip属性的控件上,浮动框就会显示出来。同样它的Content可以包含任何的内容。
  这里有一个地方需要注意:ToolTip类绝对不能被直接放在UI元素树中,他必须被赋值给另一个元素的ToolTip属性。也就是说不能直接定义一个Tooltip,他是作为一个控件的Tooltip属性而存在。

例如 作为一个Button按钮的Tooltip属性的子元素。

<Button>
OK
<Button.ToolTip>
<ToolTip>
这是Button的Tooltip
</toolTip>
</Button.ToolTip>
</Buton>

 

 

  *Frame

  按照书上说的可以把它作为一个功能强大的“Microsoft Web Browser”ActiveX控件 或者 Microsoft Forms WebBrowser控件。因为此控件的一个重要属性Source是System.Uri类型,也就是说,此控件时用来显示网页的。
  要想设置它的Content属性必须显示地设置,不能直接在开始标签更结束标签中隐式定义。因为在Xaml中,不把Content作为Frame的一个属性。他的优先级比Source高。

 

 带有头部的容器

 在Winform中此类带有头部的容器有GroupBox(还有没有我就不清楚了),同样WPF也有他的存在,但在WPF中有一个控件基于他的基础上有了改进,成为WPF特有的控件--Expander
            

           折叠                                 展开

 

Expander
 <Expander Header="Logo" Margin="0,12,11,18" Name="Expander1" ContentStringFormat="" HorizontalAlignment="Right" Width="120">
            
<StackPanel >
                
<Image Source="http://www.baidu.com/img/baidu_logo.gif"></Image>
                
<Image Source="http://www.baidu.com/img/baidu_logo.gif"></Image>
                
<Image Source="http://www.baidu.com/img/baidu_logo.gif"></Image>
            
</StackPanel>    
</Expander>

 

 

同样想在Expander中显示多个项就必须用一个容器把这些项装起来作为一个大项添加到Expander的Content的属性中。

 

 

 

--------------------------------------------------

  跟师兄出去饱吃了一顿,湘菜,第一次吃啊。好辣,如果不是很饿的话,可能真的吃不下了。
 一开始的时候痛苦啊,吃着吃着就习惯了,原来传说中的水煮鱼是这个味道的,不错,很香。

博客N久没写咯,加油。一步一个脚印慢慢来。

posted @ 2009-12-11 21:00 尐傑.net 阅读(101) 评论(0) 编辑

 首先在使用WPF时并不一定要使用Xaml,每一件Xaml能做的事情可以用任何一种.net语言实现,反过来就不行,就好像营养师可以为你调节饮食使得你身体健康间接使你外貌美丽,化妆师可以直接使你外貌美丽但他不能使你身体健康。Xaml扮演的角色是化妆师。但很少有使用WPF而不是用Xaml的情况,因为Xaml有它的好处:
  *用最简单的方式表示用户界面与对象关系
  *使得程序界面与后台逻辑分离。也就是说设计师可以专注于界面设计,程序员专注于后台逻辑的实现
  *可以应用于其他技术,如WF(Windows Workflow Foundation)

  *可以用如XamlPad这样的不需要编译就可以查看结果的软件查看Xaml的效果(如果需要对某个地方做多次修改,每次都要编译才能查看效果是很烦人的)

 

  在Visual Studio中创建一个WPF项目,并在窗口中拖进一个Button控件。就会出现如下Xaml语句:

Code1

  Xaml是基于Xml,所以整体看上去跟Xml很相似。如果用从xml的角度来看的话,存在一个windows的根节点,然后跟节点有4个属性(x:clss,xmlns,xmlns:x,title,height,width),有一个子节点grid,子节点中包含一个Button的节点有4个属性(margin,name,flowdirection)和一个值Button。
  那么以上的东西我们用xml分析了结构,但在Xaml中上面都代表了什么呢?
 

  上面说到Xaml能做的东西用任何一种.net语言都可以实现。如果我们用vb.net在一个窗口中创建一个按钮,首先我们必须引用命名空间,然后创建并实例化命名空间里面的窗口类跟按钮类。然后设置窗口对象和按钮对象的属性。
  Xaml在一开始也是要引用命名空间,vb.net中利用imports关键字,C#用using关键字,Xaml就在根节点中用xml记录节点属性的方式,为根节点的xmlns赋上命名空间的名字。如代码中的:

1    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
2    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

 上面的字符串看起来像一个网址,其实这个网页并不存在,他其实是一个命名空间的名字,只是他的名字比较特别。("http://schemas.microsoft.com/winfx/2006/xaml/presentation")对应.net中的多个命名空间,xaml在引用命名空间的时候通常会对命名空间定义一个标记符(别名)。xmlns:x ,X在Windows根节点内都会代表("http://schemas.microsoft.com/winfx/2006/xaml")命名空间。
  通常第一定义的命名空间成为“主要命名空间”(使用得最多)不带标记符(为了方便啊,使用得最多,每次都要带别名就书写跟可读性就差了)。第二个定义的命名空间为“次要命名空间”带标记符X,这个X是随便写的,不过大家的习惯次要命名空间的标记符都是X(要跟上步伐,每个人都这样咯,我们跟风吧)。

 

  如果有学过ASP.NET的同学应该知道asp.net中网页元素跟程序逻辑是分开在两个文件中,如果新建一个页面输入名字为Index.aspx,Visual Studio会自动生成另一个同名的文件Index.vb或index.cs。当你在设计模式中创建一个按钮然后双击按钮准备输入按钮的单击事件,Visual Studio会切换到源代码模式并打开index.vb。这样就实现了网页设计跟后台逻辑的分离。
  同样是微软的东西,相同之处还是有的。Xaml负责界面设计那么它一定有一种规则使得他跟另一个后台逻辑的文件绑定共同实现一个程序窗口。那么这种规则就是把与一个后台逻辑类的类名赋值改X标记符(相当于"http://schemas.microsoft.com/winfx/2006/xaml"命名空间)里面的class。

 

  属性元素与特性
  在Windows 的节点中title,height,weight就是windows(窗口)元素的特性,因为这些特性源于主要命名空间,所以在赋值这个特性的时候直接使用特性名。
    title=,height=,weight=
  表示Xaml中一个XML元素的特性可以使用属性元素的规则。例如

<Button Name="Button1" FlowDirection="LeftToRight">
<Button.Margin>
93,102,57,70.5
</Button.Margin>
<Button.Content>
Button
</Button.Content>
</Button>

与上面的代码中定义的Button是同等的。Button.Content中的句点是用于区分对象元素与属性元素。以“类型名.属性名”的形式出现,然后属性值就放在对应属性元素的开始于结束标签中。还有一点需要注意的是属性元素没有特性。就是不可能出现<Button.Content ABCD=123>属性值</Button.Content >.

  类型转换器
  它是使得Xaml简洁的功臣之一,在上面的属性元素中无论是位置(Maigin)还是内容(Content)包含的值都没有指定值得类型,我们知道在任何一种.net语言中,对一个对象的属性赋值,赋的值必须符合对象属性的类型。不然就会出错。那么在Xaml中没有指定值的类型他是怎样实现赋值的呢?
  需要说一下的是上面的值既不是String(字符串)也不是Object(对象)。Xaml解析器或编译器会存在能解析并转换这些值得类型转换器,把这个值转换成Button对象所支持的类型。

 

  标记扩展
  它跟类型转换器一样,加强Xaml的表达能力。当转换器不能为你提供一些属性类型的转换(你想为一个属性赋值,但这个值的类型内置的转换器不支持),那么你就需要从其他类中取得这个属性的类型。这就需要用到标记扩展。

<Button Backgroud="{x:Null}" 
        Height
="{x:Static SystemParameters.IconHeight}" 
        Content
="{Binding Path=Height,RelativeSource={RelativeSource Self}}" />

  只要把特性值用花括号({})括起来,Xaml编译器或解析器就会把认做标记扩展,然后从相当的类或对象中获取相应的值。
    *这部分还不是很了解,定个标记。

 

 

------------
  先写这么多吧,明天继续。这章不知道是实在抽象难懂还是我笨,看了两遍才勉强写出上面那些东西。
  在图书馆借的《WPF全视角分析》Xaml那部分我看不下去,在当当网上买了《WPF揭秘》昨天下午收到。然后看了两章。感觉比那本全视角容易懂一点。

  我最怕冷了,在宿舍我都要穿4件衣服。这个冬天要我怎样过啊!!!

posted @ 2009-11-19 21:59 尐傑.net 阅读(294) 评论(0) 编辑
  今天冒着小雨跟两个朋友出去广州的正佳广场,这个星期举办的美食节,大概有几十个摊位吧。狠狠死吃上一顿。买了就在街上吃,第一次啊。东西都不贵,5~10元一份,好多都是1份4件,如果是4个朋友去就刚好啦。一个摊位就选一样买一份,然后4个人一人吃一件。我们3个人就轮流没人吃多一件。整条街没走一半就吃饱了。羊肉串,鹅肝烧饭,碗仔翅,羊腿,上海灌汤包,葡挞。好多。如果每件都吃的话可以吃一天。
  吃葡挞的时候烫到了。不知道它是刚出炉的。吃完葡挞再吃其他东西好像没味道一样。嘴巴麻痹了,不过这个状态还好时间不长。
  整天毛毛细雨的,想待时间长点都不行,4点多就回到学校。
posted @ 2009-11-15 19:50 尐傑.net 阅读(9) 评论(0) 编辑
XML

  WPF的XAML跟XML非常类似,为了能更好的理解XAML,我就先了解下XML然后XML跟HTML又很相似,所以理了解了XML后自己的知识树就可以连起来啦。不用学习XAML的时候,知识树丛HTML到XAML中间诺空的。

  XML的宽展名为.xml,全名可扩展标记语言(eXtensible Markup Language),它主要的作用就是交互数据,将两个系统之间交换数据。他允许创建和使用有用户自定义的标记,不像HTML那样只支持有限的内置标记。
  我们打开一个网页,在网页的空白处右键--查看源文件。我们可以看到页面的HTML代码。其中<html>....</html>、<body>....</body>、<title>...</title>这些就是HTML的标记,你必须使用这些标记把你需要显示的内容对好入座。如果想用户打开一个页面,浏览器的标题改变的话,你要必须把标题写进<title>你的标题写在这个位置</title>标记里面。HTML只提供了有限的几个标记。而XML用户可以自己定义自己需要使用的标记。
  同时XML要有验证文档DTD,DTD说白了就是一种格式,一个规范。他制定了xml要使用怎样的结构处理数据。如我们日常生活中经常见到的表格。当你去申请一个护照的时候,接待员不能给你一张白纸,让你自己把个人资料写进白字。虽然使用白纸你可以自己建立自己的表格来使你的个人信息更清晰(这里白纸就代表XML,自己用自定义并使用标签就相当于可以自己设计表格)。如果这个个人资料是你自己浏览的,你自己定义表格没关系。但现在你是申请护照,你的个人资料是上交上去的。如果每个人都自己定义自己的表格,处理这些资料的时候就非常困难。所以接待员都会给你申请表,要你严格按照表格中的内容格式填写。这样处理这些资料的时候就很快。
  同样XML可以用户自己定义标记,如果两个系统之间交换数据,每个程序都自己定义自己的表格。传给另一个程序的时候,那个程序还有分析数据结构再把它需要的信息读取出来。大家都一起商量好定义一个表格,严格按照这些表格交换数据,那么两个程序的工作就只是把数据写进跟读出来就可以了。
  DTD的文档格式是.dtd,建立一个DTD文档时第一行必须写进注释(让系统知道这是一个验证XML文件是否符合格式的文档)。<!-DTD for supplier docment->
  在XML中如有要验证数据就要加上一行连接DTD文档的注释<!DOCTYPE supplier SYSTEM "supplier.dtd"> ,其中supplier.dtd就是dtd文件的名字,如果XML跟DTD不是放在同一个文件夹里面还必需指定DTD的路径。

 

还看了XML的几个方面,我就不写啦。明天关于XAML的时候都会提到。

 

 

 

-----------------
  学习不可以落后啦。有时间发现宿舍很嘈啊。。以后要去阅览室或者图书馆看咯。看WPF不想以前的面定对象,以前我起码接触过。现在完全是陌生的,看起来要一句一字地读。有时候一句话要读两编,他们嘈的时候很难思考。

  今天下了雨天气又开始冷咯。多穿衣服啊。注意身体!

posted @ 2009-11-12 22:47 尐傑.net 阅读(5) 评论(0) 编辑
    一天又过了,这个学期第4次火锅啦,今天过节跟宿舍附近的师弟出去吃了一顿。想不到80%的师弟都是光棍,今晚跟他们聊得很开啊。想不到他们上大学之前有这个多有趣的事啊,一个个轮流讲一大堆故事。我就在哪里听故事,因为我没故事说啦。平平凡凡的过了这么多年,从小到大都是很容易令人忘记的角色。
  今天决定学下WPF,网上都说学WPF需要花很大的成本,可能学习周期、书籍、时间用得比较多吧。我现在还在学校相对出去工作,这些成本还是比较低的。反正迟早也要学,现在打算要用到,就现在学吧。可能这个学习过程会很辛苦,第一次接触它。要从最基本的开始,希望我能忍耐得住学习过程中的寂寞吧。 一个只有3年多的新技术,关于他的资料跟书籍都不多。只能自己多思考了。在图书馆很艰难的才找到一本《WPF全视角分析》,不管他好不好啦。配合电子书慢慢来。
  接着也保持学习笔记的博客。

  我不要再沉默,从小到大没拿过第一。这次的多媒体作品设计比赛我不打算参加了。努力准备第3届跟毕业设计,在这两个中最小要拿一个第一。我要回忆!
 
posted @ 2009-11-11 22:14 尐傑.net 阅读(8) 评论(0) 编辑
摘要: 那本书想看的地方已经看完了,剩下那些讲的XML等一些面向对象编程会用到的技术,不太感兴趣,因为感觉毕业设计还用不到,找个时间没事再看吧。 昨天晚上宿舍3个人一起看部恐怖片。3个人都睡不着,熬了一个晚上。痛苦啊。 我好像学wpf,想把播放器做的漂亮点。但现在播放器在winform中功能都还没完成实现,我不想中途停止DirectShow的学习。 今天在班群看到系多媒体小组举行的第2届网络多媒体作品设计...阅读全文
posted @ 2009-11-09 23:21 尐傑.net 阅读(16) 评论(0) 编辑
摘要: UML是一种建模语言。UML用户指南将UML定义为“一种用于可视化表示、指定、构造和描述软件密集系统中部件的图形化语言”类图的结构属性 以上一个Cabbie类的类图,类名是Cabie 有两个属性(companyname、name)并定义为私有方法(属性名前有(-)号,表示该属性为私有属性,如果是(+)号,属性就为公共属性),而属性的类型为String。 通常我们定义属性都会...阅读全文
posted @ 2009-11-07 23:39 尐傑.net 阅读(182) 评论(0) 编辑
摘要: 进一步介绍组合(聚合),存在has - a 关系 使用组合的原因是,可以通过结合相对简单的部分构建系统或者对象中共性不明显的系统。组合在其他方面好处也很明显,你可以随便替换部件,台式电脑为例。显示器你可以换,键盘鼠标你也可以换,只要符合你电脑的接口要求,你可以随意更换台式电脑的部件。同时组合的另一个方面可使一个系统的功能更加强大。例如我们为台式电脑组合进一张电视卡,我们的电脑就可以用来观看电视节目...阅读全文
posted @ 2009-11-06 19:21 尐傑.net 阅读(5) 评论(0) 编辑
摘要: 昨天看的那章书,主要讲述继承和组合在面向对象设计中的作用和概念,今天这章书就更深一步简述代码的重用。 如果写代码重用能降低系统的开发与维护成本,所以大家在设计程序的过程中都会考虑到代码重用的问题,重用并非面向对象独有的特性,在非OO语言中也有很多代码重用的例子,所以为了减低开发成本而是用代码重用并非一定要遵从OO规范,但是面向对象对重用提供了很多有利于代码重用的机制。所以遵从OO规范还是有必要的。...阅读全文
posted @ 2009-11-05 23:40 尐傑.net 阅读(6) 评论(0) 编辑
摘要: 继承与组合(聚合) 继承指从其他类继承属性和行为,他们之间存在父子关系,被继承的类称为父类。 is-a关系,例如:人是(is a)哺乳动物。 组合(书中翻译组合,通常好像说聚合吧,因为是书的笔记所以以下还是以书为标准)指使用其他对象来构建新对象。has-a关系,例如:电脑(has a)显示器。 继承与组合可以使得对象得到重用。重用使得系统的开发维护效率更高。在OO技术开始成为主流的时候,大家的目标...阅读全文
posted @ 2009-11-04 21:39 尐傑.net 阅读(9) 评论(0) 编辑