设为首页 收藏本站
查看: 1309|回复: 0

学习WPF,转向移动互联网(windows phone && windows 8 )开发(下)

[复制链接]

尚未签到

发表于 2015-5-23 05:33:05 | 显示全部楼层 |阅读模式
一、      绑定(Binding )

定义                                                        
l         绑定是应用程序UI与业务逻辑之间建立连接的过程。

l         四个组件,绑定目标对象、目标属性、绑定源、绑定值的路径。

目标属性必须是依赖属性。建立绑定时,是将绑定目标绑定到绑定源,例如:使用数据绑定在Datagrid显示xml数据,就是将Datagrid绑定到xml数据。

绑定的数据流方向
1、  OneWay 绑定源属性值更改自动更新目标属性,目标属性值更改不会传播给绑定源属性(源—>UI)。

2、  TwoWay 绑定源更改更新目标属性,目标属性更改更新绑定源(源UI)。

3、  OneWayToSource OneWay 绑定相反;它在目标属性更改时更新源属性。 一个示例方案是您只需要从 UI 重新计算源值的情况(UI—>源)。。
4、  OneTime该绑定会导致源属性初始化目标属性,但不传播后续更改。此绑定类型实质上是 OneWay 绑定的简化形式,在源值不更改的情况下可以提供更好的性能(源—>UI(一次性))。

l         源值改变的时机由UpdateSourceTrigger控制,PropertyChanged即时改变,LostFocus目标对象失去焦点时改变,Explicit当应用程序调用 UpdateSource 改变(eg:提交时改变)。

指定绑定源的方法                                                   
u       绑定到另一个元素的某个属性值。EgTextBoxAText目标数属性 绑定 TextboxB对象,绑定值的路径Path=Text。使用ElementName绑定方法。




u       Source 属性是一种可以显式设置 Binding 的源和重写继承的数据上下文的方式。

Eg:现有一个string类型PersonName属性的Person对象。


               

           

           

u       RelativeSource。可以为目标对象指定绑定到其自身的其他属性,或者是其父元素的属性。在创建数据模板和控件模板、样式时使用。

Eg:在Datagrid的表格鼠标悬停时,使用Tooltip放大其表格的内容。


         

         

u       DataContext。将多个元素的属性绑定到同一个数据源时使用,在父元素的中设置,子元素继承之。

数据转换(默认转化器和自定义转换器)                                
集成接口IValueConverter实现ConvertConvertBack方法。

  


DSC0000.gif DSC0001.gif View Code

1  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
2
3         {
4
5             int index = (int)value;
6
7             string result = null;
8
9             switch (index)
10
11             {
12
13                 case 1:
14
15                     result = "星期一";
16
17                     break;
18
19                 case 2:
20
21                     result = "星期二";
22
23                     break;
24
25             }
26
27             return result;
28
29         }
30
31         public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
32
33         {
34
35             string index = (string)value;
36
37             int result = -1;
38
39             switch (index)
40
41             {
42
43                 case "星期一":
44
45                     result = 1;
46
47                     break;
48
49                 case "星期二":
50
51                     result = 2;
52
53                     break;
54
55             }
56
57             return result;
58
59         }

绑定到集合                                                         
u       应使用ItemSource属性,ModeOneWay

u       设置动态绑定,集合的删除、插入操作可以自动更新UI,那集合必须实现INotifyPropertyChanged接口(此接口公开一个PropertyChangedEventHandler的事件,只要基础集合发生更改,都应该引发该事件)。WPF 提供 ObservableCollection类,它是公开 INotifyCollectionChanged 接口的数据集合的内置实现。

u       集合视图

一旦 ItemsControl 绑定到数据集合,您可能希望对数据进行排序、筛选或分组。 若要执行此操作,可以使用集合视图,这是实现 ICollectionView 接口的类。

方法:定义个集合视图,在此视图上进行排序、筛选、分组的操作。绑定的目标对象绑定其集合视图。

XAML:



         

        

      


        

            

            

        

        

            

              

               

            

        

        

            

            [l4]

        

        

Code



View Code

  1 ///
  2
  3         /// 集合视图
  4
  5         ///
  6
  7         CollectionViewSource datagridview;
  8
  9         public MainWindow()
10
11         {
12
13             InitializeComponent();
14
15             //获取XAML的view
16
17             datagridview = (CollectionViewSource)(this.Resources["view"]);
18
19             ObservableCollection listEmy = new ObservableCollection
20
21             {
22
23                 new Employee(){ RowNum=1, S_STUFFCODE="00587000123", S_STUFFNAME="张三", S_SEX="1"},
24
25 new Employee(){RowNum=2,S_STUFFCODE="00587000124",S_STUFFNAME="李四",S_SEX="1"},};
26
27             //设置视图的Source
28
29             datagridview.Source = listEmy;
30
31          }
32
33         ///
34
35         /// 排序
36
37         ///
38
39         ///
40
41         ///
42
43         private void sort_Checked(object sender, RoutedEventArgs e)
44
45         {
46
47         datagridview.SortDescriptions.Add(
48
49                 new SortDescription("S_STUFFCODE", ListSortDirection.Descending));
50
51         datagridview.SortDescriptions.Add(
52
53               new SortDescription("S_STUFFNAME", ListSortDirection.Descending));
54
55         }
56
57         ///
58
59         /// 清除排序
60
61         ///
62
63         ///
64
65         ///
66
67         private void sort_Unchecked(object sender, RoutedEventArgs e)
68
69         {
70
71             datagridview.SortDescriptions.Clear();
72
73         }
74
75         ///
76
77         /// 分组
78
79         ///
80
81         ///
82
83         ///
84
85         private void group_Checked(object sender, RoutedEventArgs e)
86
87         {
88
89             PropertyGroupDescription group = new PropertyGroupDescription();
90
91             group.PropertyName = "S_SEX";
92
93             datagridview.GroupDescriptions.Add(group);
94
95         }
96
97         ///
98
99         /// 清除分组
100
101         ///
102
103         ///
104
105         ///
106
107         private void group_Unchecked(object sender, RoutedEventArgs e)
108
109         {
110
111             datagridview.GroupDescriptions.Clear();
112
113         }

数据验证ValidationRuleSystem.Windows.Controls                     

接受用户输入的大多数应用程序都需要具有验证逻辑,以确保用户输入了需要的信息。验证检查可以基于类型、范围、格式或其他应用程序特定的要求。

WPF内置的ValidationRule对象                                       
u      ExceptionValidationRule 检查在更新绑定源属性的过程中引发的异常


            

               

                    

                        

                           

                        

                    [l6]

               

            

      

Code

        Employee e = new Employee() { RowNum = 1, S_STUFFCODE = "00587000123", S_STUFFNAME = "张三", S_SEX = "1" };

        stk.DataContext = e;[l7]

本例子中TextBox绑定了Employee中的RowNum属性,RowNumint型,当在TextBox中输入的类型不是int类型时,就触发ExceptionValidationRule异常。

u      DataErrorValidationRule表示一个规则,该规则检查由源对象的 IDataErrorInfo 实现所引发的错误。

        

            

               

                    

                        

                           

                        [l8]

                    

               

            

        


Code



View Code

1  public class Person : IDataErrorInfo[l9]
2
3     {
4
5         private int age;
6
7         public int Age
8
9         {
10
11             get { return age; }
12
13             set { age = value; }
14
15         }
16
17         public string Error
18
19         {
20
21             get
22
23             {
24
25                 return null;
26
27             }
28
29         }
30
31         public string this[string name]
32
33         {
34
35             get
36
37             {
38
39                 string result = null;
40
41  
42
43                 if (name == "Age")
44
45                 {
46
47                     if (this.age < 0 || this.age > 150)
48
49                     {
50
51                     result = "Age must not be less than 0 or greater than 150.";
52
53                     }
54
55                 }
56
57                 return result;
58
59             }
60
61         }
62
63 }

    自定义绑定验证                                                            

通过从ValidationRules类派生和实现Validate方法来创建自己的验证。

u      定义验证规则



View Code

1  public class Validation : ValidationRule
2
3          {
4
5         public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
6
7         {
8
9             int age = Convert.ToInt32(value);
10
11             if (age > 150)
12
13             {
14
15                 return new ValidationResult(false, "数字过大!");
16
17             }
18
19  
20
21             return new ValidationResult(true, null);
22
23         }
24
25       }

u      XAML中绑定


            

               

                    

                        

                           

                        [l10]

                    

               

            

        

l         数据验证错误显示模板

当输入值无效时,需要在UI反馈用户。提供反馈的方法是将Validation.ErrorTempate附加属性中加入自定义的ControlTempate

   

         

             !

              

         

   


   

      

      


   



  二、      WPF和之前的技术交互(WPF/WinForms)


System.Windows.Forms.Integration 命名空间提供实现常见互操作方案的类。 实现互操作功能的两个关键类是 WindowsFormsHostElementHost

l          WPF 中承载 Windows Forms窗体控件
l         方法:
  在wpf上承载Windows Forms控件,需要使用WindowsFormsHost。(添加System.Windows.Forms和WindowsFormsIntegration程序集的引用。
Eg:

        

            

        


l         限制
u Windows Forms控件不能调整大小,或者只能调整为特定的尺寸。
u Windows Forms控件不能旋转和扭曲。
l          Windows Forms中使用Wpf
l         方法:
Windows Forms中使用Wpf,需要使用ElementHost。

三、      怎样布局一个漂亮的UI的?

l         项目总结
u 已有控件布局。界面统一风格(使用Blend绘出界面背景),使用样式、模板改变控件外观。
Eg:datagrid treeview
u 通过使用Blend软件,绘制自定义控件。
l         布局控件
l         Canvas
Canvas比较简单,只是一个存储元素的容器,它不会自动调整内部元素的排列及大小。不指定元素位置,元素将默认显示在画布的左上方。Canvas的主要用途是用来画图。Canvas默认不会自动裁减超过自身范围的内容,即溢出的内容会显示在Canvas外面,这是因为默认 ClipToBounds="False";我们可以通过设置ClipToBounds="True来裁剪多出的内

l         StackPanel
StackPanel就是将子元素按照堆栈的形式一一排列,通过设置面板的Orientation属性设置了两种排列方式:横排(Horizontal默认的)和竖排(Vertical)。

l         WrapPanel
WrapPanel是一个非常简单的面板,从左至右按顺序位置定位子元素,如果排满断开至下一行。后续排序按照从上至下或从右至左的顺序进行。WrapPanel面板也提供了Orientation属性设置排列方式,这跟上面的StackPanel基本相似。不同的是WrapPanel会根据内容自动换行。

l         DockPanel
DockPanel定义一个区域,在此区域中,您可以使子元素通过描点的形式排列。停靠面板其实就是在WinForm类似于Dock属性的元素。(随窗体缩放、扩大)

l         Border
Border 是一个装饰的控件,此控件绘制边框及背景,在 Border 中只能有一个子控件(这个子控件又可以包含多个子控件)。Border 的几个重要属性:Background:用用一个 Brush 对象来绘制背景 BorderBrush:用一个Brush 对象来绘制边框 BorderThickness:此属性设置 Border 边框的大小;CornerRadius:此属性设置 Border 的每一个角圆的半径;Padding:r属性设置 Border 里的内容与边框的之间的间隔。




[l1]当前应用程序


[l2]实体model&#8217;


[l3]绑定到集合视图


[l4]触发排序、分组


[l5]注意的地方


[l6]验证


[l7]设置绑定源


[l8]绑定验证


[l9]实现这个接口


[l10]使用自定义绑定

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-69633-1-1.html 上篇帖子: MonoGame Windows 8:Windows 8 Metro Style下的XNA 下篇帖子: 快速构建Windows 8风格应用21-构建简单媒体播放器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表