WPF摘抄

简单的布局有Canvas


StartPoint和EndPoint表示渐变线的起点和终点,控件的左上角点的坐标为(0,0)右下角点的坐标为(1,1)。
前面的数字表示水平。使用GradientStop的Offset,可以定义多个渐变点(Offset的值在0和1之间),

-----------------------------------------------
4.0 Framework 引用 2.0 的Sqlite,需要在根目录新建app.config文件,里面CODE如下:

<?xml version="1.0"?>
<configuration>
<startup  useLegacyV2RuntimeActivationPolicy="true">

 <supportedRuntime version="v4.0" />
</startup>
</configuration>
-------------------------------------------------------

设置对宽度和高度赋值“Auto”,该Grid尺寸将会随着内部内容的增加而增加,这个设置方法是最常用的一种.
该设置对宽度和高度赋值"*",或者"2*",Grid将按照设置的比例倍数进行分割布局;

         <Grid.ColumnDefinitions>
             <ColumnDefinition Width="*"/>
             <ColumnDefinition Width="3*"/>
         </Grid.ColumnDefinitions>


Canvas布局控件,相对于其他布局控件的优势在于可以自由的设定其包含区域内控件的位置
Canvas中的子控件,属性栏中,没有Grid控件中的Margin属性,而是使用Left和Top进行定位

ScrollViewer控件,是从WPF中移植来的,针对大内容控件的布局控件。由于该控件内仅能支持一个子控件,所以在多数情况下,ScrollViewer控件都会和Stackpanel,Canvas和Grid相互配合使用。如果遇到内容较长的子控件,ScrollViewer会生成滚动条,提供对内容的滚动支持。

由于内容过长,ScrollViewer的滚动条自动激活。对于ScrollViewer的滚动条,可以通过Properties属性栏进行设置控制,可以禁用,隐藏,或者设置仅在需要时候自动显示。
HorizontalScrollBarVisibility和VerticalScrollBarVisibility属性:

Border控件,是最简单的布局控件,也是最早期的一款Silverlight布局控件,该控件允许用户创建一个带有边框的布局控件。使用Border控件唯一需要注意的是该控件内仅能支持一个子控件。

 

 


对于初学者往往会习惯直接使用控件拖拽的形式来将需要的内容添加到窗体上。会使控件在一定的坐标上固定位置,这是一种不推荐的做法。在WPF窗体中,一个窗体只能持有一个控件,当多个控件想要在窗体中展现时,就需要首先设置一个容器控件(Container),然后将其他控件放到这个控件里面,形成树状结构。

第一条,控件的布局应该有容器来决定,而不是通过自身使用margin之类的东西来控制位置。因为这些属性原本应该是控制自己内部展现或与邻里之间关系的


第二条,控件应避免明确的定义具体的尺寸,因为显示器分辨率及windows窗体的大小都有可能随时改变,如果明确的定义尺寸。当窗体变动后就会出现大面积的空白或是缺失。但为了控件功能及效果的展示,应该限定一个可接受的最大及最小尺寸。通过MinWidth, MinHeight, MaxWidth, MaxHeight属性可以实现这一点。

第三条,不要将界面元素位置设置成与屏幕坐标相关.现在显示器分辨率比较多样话(800×600、1024×768,我的显示器是一台是1400×1050,还有一个是1024×1280竖式的),这样的做法还是比较有风险的。

第四条,容器应将有效空间共享给其子控件,这也是为了不在窗体调整后,遗留出大块的空余。
 

第五条,容器嵌套使用,因为不同的容器,表现效果不同,必要时应结合使用。


WrapPanel则是将各个控件按照行或列的顺序摞列,当长度或高度不够是就会自动调整换列或行。StackPanel,将控件按照行或列来顺序排列不会回行。

 

//无论窗体边缘怎么托拉TextBlock和TextBox总是成对的
   <StackPanel Orientation="Horizontal" Margin="5,2,5,2">
                <TextBlock Name="textBlock_EmailAddress" Text="EmailAddress:" />
                <TextBox Name="textBox_EmailAddress" MinWidth="100" />
            </StackPanel>


对于此按钮,无论是否获得焦点、鼠标是处于其上方,显示的外观均是相同的,如果要定义以上的一些效果,可以使用触发器来实现。
Style、ControlTemplate 和 DataTemplate 都具有 Triggers 属性,该属性可以包含一组触发器。某个属性值更改时,或某个事件引发时,触发器会相应地设置属性或启动操作
触发器包含以下几种:
属性触发器
EventTrigger 和 Storyboard
MultiTrigger、DataTrigger 和 MultiDataTrigger

例如,在ControlTemplate中(即上段代码28行前插入以下代码):

   1: <ControlTemplate.Triggers> 
   2:     <Trigger Property="IsMouseOver" Value="True">
   3:         <!--鼠标在上移动时-->  
   4:         <Setter Property="Foreground" Value="Yellow" />  
   5:     </Trigger> 
   6:     <Trigger Property="IsKeyboardFocused" Value="True">  
   7:         <!--控件获得键盘焦点时--> 
   8:         <Setter Property="Foreground" Value="White" />  
   9:     </Trigger>
   10: </ControlTemplate.Triggers>


依赖项属性的用途在于提供一种方法来基于其他输入的值计算属性值。

如果要实现数据源更改时,改变目标的值(即上图中的OneWay方式及TwoWay方式的由绑定源到绑定目标方向的数据绑定),需使数据源对象实现System.ComponentModel命名空间的INotifyPropertyChanged接口。INotifyPropertyChanged接口中定义了一个PropertyChanged事件,在某属性值发生变化时引发此事件,即可通知绑定目标更改其显示的值。


-----------------------------------------
在WinForm编程时,如果想对ListBox里的Item排序,我们会直接去排列这些Item,也就是针对界面进行操作,这在WPF里就行不通了——实际上,在WPF里因为界面完全是由数据决定的(甚至包括界面元素的排序),所以,我们只需要将底层数据排序,作为界面的Items也就在数据的驱动下乖乖地排好序了。

数据是底层、是心脏,数据变了作为表层的UI就会跟着变、将数据展现给用户;如果用户修改了UI元素上的值,相当于透过UI元素直接修改了底层的数据;数据处于核心地位,UI处于从属地位。这样一来,数据是程序的发动机(驱动者)、UI成了几乎不包含任何逻辑专供用户观察数据和修改数据的“窗口”(被驱动者)。


-----------------
-为什么我在试图把listBox1.SelectedItem转换成ListBoxItem时,程序会抛出异常呢?A:因为SelectedItem指的是数据源集合里与界面中选中Item对应的那个对象,所以,它的类型是数据源集合的元素类型——在“数据驱动UI”的WPF中,请不要把“数据”和“界面”搅在一起。


------------------
所谓“多路Binding(也可以叫复合Binding)”就是指某个元素的Dependency Property的值不是由单一的数据源来决定,而是由多个数据源(通过一定逻辑)共同决定的,我们一般会把逻辑写在Converter里。多路Binding使用的类是MultiBinding类,这个类实际上就是对一组Binding对象的包装——本质上并没有影响Binding是“一对一”的基本理论。

 

posted on 2011-12-04 22:23  breakpoint  阅读(282)  评论(0编辑  收藏  举报

导航