WPF学习资料

 

http://www.cnblogs.com/Jax/category/88715.html

http://archive.msdn.microsoft.com/wpfsamples (常用实例)

http://msdn.microsoft.com/zh-cn/library/ms752299.aspx 

http://www.cnblogs.com/jv9/category/167735.html (强悍学习站)

 

 //---------------------------------------------

 

 

一个通用的WPF值转换器

在WPF中应用数据绑定时经常需要做一些简单的逻辑判断。

比如ViewModel中有一个HasError(布尔值)的属性表示是否有错误。我需要将它绑定于Button的IsEnable属性上,即:当没有错误时Button可用。这时就需要将HasError取反。WPF默认的绑定引擎是不支持的。

 

还有一种情况比如ViewModel中有一个Sex(int值)的属性表示性别,我需要将它绑定到TextBlock上,当值为1时显示男,值为2时显示女。WPF默认绑定也是不支持这种判断的。

 

于是一个通用的值转换器就诞生了,用法如下:

<Button IsEnabled="{Binding HasError, Converter={StaticResource GenericTypeConverter}, ConverterParameter='IsReverse=True'}">OK</Button>

IsReverse参数表示是否取返,如果转换的值为true则变为false,反之亦然。

 

<TextBlock Text="{Binding Sex, Converter={StaticResource GenericTypeConverter}, ConverterParameter='Alias=1:男|2:女|other:未知'}" />

Alias参数表示将值映射为字符串,other表示当遇到没有指定的值时显示的文本

 

另外bool to Visibility的转换可以自动进行,不需要指定参数。

 

有意见欢迎指正

 

完整代码如下:

 

View Code
复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Data;
using System.Windows;

namespace MoodSunshiny.WPF.Converter
{
     ///  <summary>
    
///  一个通用的类型转换器,可以提供更多转换控制参数
    
///  </summary>
     public  class GenericTypeConverter : IValueConverter
    {
         ///  <summary>
        
///  是否反转转换源参数值
        
///  仅对bool类型的值有效
        
///  </summary>
         private  bool IsReverse {  getset; }

         ///  <summary>
        
///  用于将转换结果映射为其它字符串
        
///  例如:Alias=True:是|False:否
        
///  </summary>
         private Dictionary< objectstring> Alias {  getset; }
        
         ///  <summary>
        
///  解析转换参数
        
///  </summary>
         private  void AnalyseConvertParameter( string convertParameter)
        {
             /* 设置参数默认值 */
            IsReverse =  false;
            Alias =  null;

             if (! string.IsNullOrEmpty(convertParameter))
            {
                 var pkvs = convertParameter.Split( new  char[] {  ' , ' }, StringSplitOptions.RemoveEmptyEntries);
                 foreach ( var pkv  in pkvs)
                {
                     var pkvo = pkv.Split( new  char[] {  ' = ' }, StringSplitOptions.RemoveEmptyEntries);
                     if (pkvo.Length !=  2)
                         throw  new NotSupportedException( " 不支持设置: " + pkv);
                     var pk = pkvo[ 0].Trim();
                     var pv = pkvo[ 1].Trim();

                     switch (pk)
                    {
                         case  " IsReverse ":
                             bool b;
                             if (! bool.TryParse(pv,  out b))
                                 throw  new NotSupportedException( " 参数取值错误: " + pkv);
                             else
                                IsReverse = b;
                             break;
                         case  " Alias ":
                            {
                                Alias =  new Dictionary< objectstring>();
                                 var dfkvs = pv.Split( new  char[] {  ' | ' }, StringSplitOptions.RemoveEmptyEntries);
                                 foreach ( var dfkv  in dfkvs)
                                {
                                     var dfkvo = dfkv.Split( new  char[] {  ' : ' }, StringSplitOptions.RemoveEmptyEntries);
                                     if (dfkvo.Length !=  2)
                                         throw  new NotSupportedException( " 不支持设置: " + dfkvo);
                                     var dfk = dfkvo[ 0].Trim();
                                     var dfv = dfkvo[ 1].Trim();

                                     object oKey =  null;
                                     int i;
                                     if (dfk.Equals( " true ", StringComparison.OrdinalIgnoreCase))
                                        oKey =  true;
                                     else  if (dfk.Equals( " false ", StringComparison.OrdinalIgnoreCase))
                                        oKey =  false;
                                     else  if (dfk.Equals( " other ", StringComparison.OrdinalIgnoreCase))
                                        oKey =  " other ";
                                     else  if ( int.TryParse(dfk,  out i))
                                        oKey = i;
                                     else
                                         throw  new NotSupportedException( " 参数取值错误: " + dfkv);

                                    Alias[oKey] = dfv;
                                }
                            }
                             break;
                         default:
                             throw  new NotSupportedException( " 不支持的参数名: " + pk);
                    }
                }
            }
        }

         public  object Convert( object value, Type targetType,  object parameter, System.Globalization.CultureInfo culture)
        {
            AnalyseConvertParameter(parameter  as  string);

             try
            {
                 var sourceType = value.GetType();
                 if (IsReverse && sourceType ==  typeof( bool))
                    value = !(( bool)value);

                 if (targetType ==  typeof( string))
                {
                     if (Alias !=  null && Alias.ContainsKey(value))
                         return Alias[value];
                     else  if (Alias !=  null && Alias.ContainsKey( " other "))
                         return Alias[ " other "];
                     else
                         return  value ==  null ?  "" : value.ToString();
                }
                 if (targetType ==  typeof( bool))
                {
                     if (sourceType ==  typeof(Visibility))
                         return (Visibility)value == Visibility.Visible;
                }
                 else  if (targetType.IsEnum)
                {
                     if (sourceType ==  typeof( bool) && targetType ==  typeof(Visibility))
                    {
                         return ( bool)value ? Visibility.Visible : Visibility.Collapsed;
                    }
                     else
                    {
                         return Enum.Parse(targetType, value.ToString(),  true);
                    }
                }
                 else
                {
                     return System.Convert.ChangeType(value, targetType);
                }

                 return System.Convert.ChangeType(value, targetType);
            }
             catch
            {
                 return  null;
            }
        }

         public  object ConvertBack( object value, Type targetType,  object parameter, System.Globalization.CultureInfo culture)
        {
             return Convert(value, targetType, parameter, culture);
        }
    }
}
复制代码

//----------------------------------------------------- 

 

 

WPF:Data
Binding 数据绑定基础(2)


 

数据绑定:
是一个建立应用界面和业务逻辑之间联系的一个过程。
被绑定的两者(界面和数据)是相互影响的(反映和记录对方的变化)。

绑定静态资源(资源在同一个XAML文件中,注意一定要放到最上边,紧随<Window>之后)
<Window
xlmns:system="clr-namespace:assembly=mscorlib">
<Window.Resources>
       
<system.String
x:Key="MenuFileHeader">File</system:String>
</Window.Resources>
<Grid><Menu><MenuItem
Header={StaticResource
MenuFileHeader}></MenuItem></Menu></Grid>
</Window>

绑定静态资源(资源放在独立的资源文件中:<HOME>"Resources"Skins"Default.xaml)
<ResourceDictionary
xlmns:system="clr-namespace:assembly=mscorlib">
        <system:String
x:Key="WindowMainTitle>Window Main
Title</system:String>
</ResourceDictionary>
...
...
在Application.xaml中引用所定义的资源文件(当然,你可以直接在这里定义资源)
<Application>
       
<Application.Resources>
                <ResourceDictionary
Source="Resources/Skins/Default.xaml"></ResourceDictionary>
</Application>
...
...
<Window Title={StaticResource
WindowMainTitle}>
</Window>

绑定动态资源(资源在独立的资源文件中,并被通过动态装载,参见我的WPF:换肤基础)
<ResourceDictionary
xlmns:system="clr-namespace:assembly=mscorlib">
        <system:String
x:Key="DynamicWindowMainTitle></system:String>
</ResourceDictionary>
...
...

<Window Title={DynamicResource
WindowMainTitle}>
</Window>

绑定类对象属性(参见我的WPF:数据绑定基础)

绑定数据集(DataSet)
xxx.XAML
<Window>
<Grid>
       
<TextBox Text="{Binding 
Path=Table.UserName}"/>
</Grid>
</Window>
xxx.XAML.CS
DataSet
dsUserInfo = GetUserInfo();
//默认Table[0]的名字是"Table",所以上面的Path是Table.xxx
DataContext =
dsUserInfo;

数据绑定的能力还有很多,今天先到这里,休息,休息一下。

 

 

 

 

WPF

摘要: 1.关于图片,Resource和Content的区别2.Clip和WriteableBitmap的适用场合 阅读全文
posted @ 2010-02-02 23:05 Jianqiang Bao 阅读(3090) | 评论 (13) 编辑
摘要: 以下为SL2的(包括SL3 beta):[代码]以下为SL3的:[代码] 阅读全文
posted @ 2009-07-20 13:16 Jianqiang Bao 阅读(622) | 评论 (1) 编辑
摘要:      摘要: 这是《我佩服——WPF深入研究》的第六章,包含2个示例的研究,涉及到打印的一些基本技术。 阅读全文
posted @ 2008-05-31 09:07 Jianqiang Bao 阅读(3855) | 评论 (11) 编辑
摘要: 摘要: 这是《我佩服——WPF深入研究》的第五章,包含62个示例的研究。 再不发这个帖子,真的不知要拖到什么时候了。本章其实应该有73个示例,很遗憾,我只写了62个,还有11个,涉及到自定义控件和ListView,我还没想好怎样才能描述清楚。我会在以后陆续将其补齐。就是这些,我也用了2周时间,才说清楚。 此后,要停止更新1个月左右,全力投入《博客园精华集》的工作。 阅读全文
posted @ 2008-05-30 19:06 Jianqiang Bao 阅读(10965) | 评论 (11) 编辑
摘要: 我写这套读书笔记,本意是为了作为《WPF 深入研究》一书的辅助,帮我理清思路。所以只列出对于我来说很陌生的概念,或者总结性的言语。4-7章讲的是Layout。 阅读全文
posted @ 2008-05-08 22:41 Jianqiang Bao 阅读(1719) | 评论 (5) 编辑
摘要: 我写《WPF SDK深入研究》一书到了瓶颈部分,因此停下来,看一下Charles Petzold大师写的,很多地方让我茅塞顿开,因此,做读书笔记系列,升华大师的思想,理清自己的思路,同时与大家分享我的心得。
阅读全文
posted @ 2008-05-07 23:25 Jianqiang Bao 阅读(2595) | 评论 (12) 编辑
摘要: 摘要: 这是《我佩服——WPF深入研究》的第四章,包含51个示例的研究。Layout布局看似简单,其实里面有很多技巧,本文在介绍这些布局面板的同时,还讲解了如何自定义一个Panel,以及实现它的MeasureOverride和ArrangeOverride。此外,还涉及到IScrollInfo接口,ScrollViewer的使用方法,Thickness转换器。 阅读全文
posted @ 2008-04-27 19:58 Jianqiang Bao 阅读(4483) | 评论 (7) 编辑
摘要: 这是《我佩服——WPF深入研究》的第三章,包含14个示例的研究。这一章比较怪,都是以FlowDocument为主题,进行布局设计,同时对TextBlock进行了详尽的分析。很多不常见的类出现在这一章的例子中。 阅读全文
posted @ 2008-04-22 23:49 Jianqiang Bao 阅读(3014) | 评论 (7) 编辑
摘要: 一直酝酿写一篇文章,详细地介绍WPF数据绑定的所有技术,尽量不要有遗漏。为此详细分析了SDK中的32个示例,作为《我佩服——WPF深入研究》的第二章。应该是全了。希望读者读完这篇文章不会再有数据绑定的困扰。 阅读全文
posted @ 2008-04-15 23:10 Jianqiang Bao 阅读(7269) | 评论 (13) 编辑
摘要: 早就计划写一本书,书名都起好了《我佩服——WPF深入研究》,基于MS于2005年发布的WPF SDK442个Sample,逐个研究一遍,控制在25章左右。于是就有了眼前这一章,我整整写了两周。写作的过程也是一个自我提高的过程,使我从示例中又学到了很多东西,而这些,在一般书籍上是看不到的,尤其是PageFunction结构化导航和CustomContentState定制导航这两套技术。今天共享出来,希望大家斧正。 阅读全文
posted @ 2008-04-08 21:02 Jianqiang Bao 阅读(4713) | 评论 (10) 编辑
摘要: 翻译 Programming Windows Presentation Foundation (2005) - BBL ——这本书我用了3周时间翻译,处女作,一稿,有很多地方还需要推敲。 阅读全文
posted @ 2008-04-04 14:50 Jianqiang Bao 阅读(5251) | 评论 (21) 编辑
posted @ 2008-03-08 21:02 Jianqiang Bao 阅读(299) | 评论 (0) 编辑
posted @ 2008-03-08 20:10 Jianqiang Bao 阅读(443) | 评论 (0) 编辑
摘要: 本目录持续更新中,每写完一章都会添加到Blog以及这个目录。估计本系列会在20章左右。 阅读全文
posted @ 2008-03-08 18:23 Jianqiang Bao 阅读(804) | 评论 (3) 编辑
posted @ 2007-03-30 22:36 Jianqiang Bao 阅读(1085) | 评论 (0) 编辑
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值