一些读书笔记。记录一下我不知道的WPF。

1、当没有显式的指定窗口的大小时,窗口的高和宽都是NaN,因此不可以使用Width和Height,而应该使用ActualWidth和ActualHeight ,来获取当前窗口的实际尺寸。不过以上两个属性是只读的,而且只有在窗口被绘制以后才生效。

2、WPF的度量时使用设备无关单位。为任何控件设置的长度值,都不是像素值(它们可以被设置为double),而是一个设备无关值。这里的单位是 1/96英寸,这与windows的默认显式分辨率一致(每英寸96像素),以致于看上去我们是设定了一个像素值。这样做的好处是,即使显示设备的精度会 越来越高,但WPF绘制出的布局却不会因此而变小,它们依然会保持原有的大小。

3、Brush画刷类都是从Freezable 抽象类继承过来的。Freezable 的意思是对象可以被设置为frozen状态,frozen状态的意思是不能再被改变。对象的IsFrozen Property一旦变成true,就表示对象已经被冻结,冻结对象可以提高效率,因为被冻结的对象不再需要监控。下面是一个冻结的例子:
通过new SolidColorBrush 和 使用 Brushes.Red赋值得到的画刷是有区别的,后者在生成的时候已经被冻结了,所以对后者重新赋值的时候会出现Invalid Operation Exception。
解冻操作是不存在的,但是可以通过Clone操作,获取一个没冻结的复制版本。
Freezable对象只能被创建它的线程所改变。

4、BorderBrush会使客户区的面积变小。

5、径向渐变画刷的几个扩散选项的效果写法。
brush.SpreadMethod = GradientSpreadMethod.Pad;
brush.SpreadMethod 
= GradientSpreadMethod.Reflect;
brush.SpreadMethod 
= GradientSpreadMethod.Repeat;

6、Window类的Content property 是从contentControl继承的。又被定义为object,因此可以定义为任何的东西(除了window)。不过只能设定一个内容给content。想要添加多个内容,就要使用布局控件了。

7、在Content property的世界中,,分成两组对象,一组继承UIElement,一组不是。后者会使用toString来显示,前者将使用OnRender来显 示。假如一个控件不是contentControl,又被设定为Content的内容,那么就会调用控件的toString方法进行显示。若 Content property被设置成一个字符串,那么ContentControl将会先创建一个textBlock对象,然后再实际显示此字符串。

8、早期windowsAPI中,几乎屏幕上所有的东西,都被认为是控件,现在却不是这样。控件是视觉对象(Visual Object),其特征是对用户的输入有反应。

9、TextBlock中各个文本的格式可以不一致。TextBlock有一个inlines属性,是Inline对象的collection。继承自FrameworkContentElement。 collection可以加入字符串对象,Inline对象和UIElement对象。Inline对象包括:Run Span (Bold Hyperlink Italic Underline)

TextBlock text = new TextBlock();
text.Inlines.Add(
"this is a ");
text.Inlines.Add(
new Bold(new Run("TextBlock")));
text.Inlines.Add(
new Italic(new Run("Demo")));
Content 
= text;

10、UIElement 与子类 FrameworkElement  与   ContentElement 和子类 FrameworkContentElement的区别
ContentElement没有OnRender方法,它们不会在屏幕上把自己画出来,要通过“继承自UIElement的类”的OnRender方法 画出来。理解一下上面的代码,Bold或Italic构造函数只接收Inline对象,不接受字符串对象,所以需要调用Bold和Italic的Run构 造函数。

11、屏幕上的element会根据逻辑树组织,从父亲向下传递属性值。除非孩子显式地设定某些Property,否则将直接沿用父亲的Property值。例如窗口的Foreground会传递到下面的各个控件。

12、ButtonBase定义了一个名为ClickMode的Property,指定按钮要如何反馈点击,即什么时候下产生Click事件。通常都是release,但是Press和Hover都有需要他们的场合。

13、关于Margin和padding。margin是外边距,padding是内边距。在WPF中,应该少用Width和Height属性,而通过margin属性去获得自动调整的能力。

14、Resource的读取。程序中可以通过URI访问资源。资源是被共享的,每个资源只会建立一个对象,没有被引用到则不会建立。

15、应该在xaml中使用Resource资源来放置常量。x:Key 用于识别这些资源。另外还有一个markup extension 名字叫x:Static 专门用于存放静态的Property或字段,也适用于枚举成员。

在任意的资源字典(resource dictionary)内,key应该独一无二。StaticResource是一个特殊的关键词,用在xaml里面查找资源字典中的资源。可以用以下的两种语法实现。
(这里使用double类型的时候,需要引用System命名空间
<Window ......
xmlns:s
="clr-namespace:System;assembly=mscorlib"
Title
="Window1" Height="300" Width="300">
<StackPanel>
<StackPanel.Resources>
<s:Double x:Key="fontsizeLarge">
18.7
</s:Double>
<s:Double x:Key="fontsizeSmall">
14.7
</s:Double>
</StackPanel.Resources>
<Button>
<Button.FontSize>
<StaticResource ResourceKey="fontsizeLarge"/>  // 使用了property element语法
</Button.FontSize>
Button with large size
</Button>
<Button FontSize="{StaticResource fontsizeSmall}" >  //使用了attribute语法
Button with small size
</Button>
</StackPanel>

相关文章: