关于ListBox的ItemsPanel和Template的备忘

http://stackoverflow.com/questions/1924089/listbox-virtualizingstackpanel-and-smooth-scrolling-in-wpf

ItemsPanel属性需要一个ItemsPanelTemplate类型的元素,而其中必须要有一个VirtualizingStackPanel(需要Panel这个集合容器),如果某种style让它变成了普通的StackPanel,就没有virualization的功能了.
Template属性需要一个ControlTemplate元素,里面放一个WPF UI元素就行,这里我们可以直接放VirtualizingStackPanel。
两种方法都可以改变ListBox的布局(不是ListBoxItem),因为作为ItemsControl子类,有ItemsPanel这个FrameworkTemplate;作为Control的子类,又有Template(ControlTemplate类型,也是FrameworkTemplate)。

但是,第二种方法是直接改变了ListBox的Template,避免使用了默认的ItemsPresenter,ListBox本身的一些功能也会受影响,包括ItemsPanel,GroupStyle的设置,全都不再生效了–你要自己实现。第一种方式指定的ItemsPanelTemplate之所以能生效,是因为会被ItemsPresenter使用,所以必须依赖默认的ItemsPresenter的实现(在默认的ControlTemplate里)

另外,查看默认各种控件的Template的工具(利用了XamlWriter)

show me the templates,好东西。

感恩节萨瓦纳行,照片,备忘(上)

早上车顶上的冰晶,结晶的形状很漂亮
感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员
 savannah离亚特兰大接近300英里,开车4个小时多。同事买的一辆二手车,2001年11月产的Nissan Maxima,3.5升六缸的V6引擎,驱动轮后置,马力非常强劲,只花了3500美元,对方还送了导航仪等各种小东西,实在超值,车管所过户都没花钱,上新牌照的手续费20,税250多,牌照20,一共也不超过300美元。美国买二手好车实在超值,这车如果在国内上市,新车肯定过30万。路上一般开75到80英里/小时,偶尔也会飙到90(145公里/小时),幸好没有碰到交警。住宿通过priceline.com搜索和预定的Motel 6连锁,双人双床房含税39.9美元,便宜的代价是离市中心半小时的车程。感恩节(周四)当天大部分餐厅和商店都关门,类似中国的春节。连肯德基叔叔都关门了,但是第一品牌麦当劳仍然全面营业,不得不感恩麦当劳。

 

感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员

Motel边上有一家Denny’s,美国的连锁餐厅很多都是XX’s,比如Windy’s Arby’s等等。

感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员

Denny’s 内部是典型的美国路边餐厅的样子。

感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员

早餐份量非常足。

感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员
感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员

savannah市中心的forsyth park,男的人鱼,有两条尾巴。

感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员

路上见别人的house很漂亮,就下来拍了。

感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员
感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员
感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员

savannah最多的就是南方橡树(oak),树上挂满了Spanish Moss(苔藓),

Bonaventure 墓园:

感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员
感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员
这个城市的街道也比较有特色,按美国同事的说法,这个算是比较有历史的古城,城市规划很规整,有不少老建筑。亚特兰大作为内战中南方军的老巢,被彻底摧毁了,可以参考电影《乱世佳人》;savannah则幸免遇难,所以保留得相当好。只是感恩节当天City Hall也关门,教堂又在搞仪式,不方便闯进去拍照。
感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员
感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员
感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员
感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员
感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员
感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员
感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员
感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员
savannah河是亮点,河边是步行街,商业发达,也是个重要的港口,以前是拍卖黑奴的地方。
感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员
感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员
感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员
感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员

圣诞节虽然还有接近一个月,但是已经开始宣传了,到处可以听到Jingle Bell, Jingle Bell,Jingle all the way。

来到港口城市,就奢侈一把吃了海鲜,人均30美元,其实也不算特别贵。

感恩节萨瓦纳行,照片,备忘(上) - yww325 - 程序员

转载:异常Cannot perform this operation while dispatcher processing is suspended的处理

http://hexword.wordpress.com/2009/12/10/how-to-handle-cannot-perform-this-operation-while-dispatcher-processing-is-suspended-errors-in-wpf/

上面的文章指出了一种做法,但是如果WPF程序中充满了这样的代码,你就应该反思自己写的到底是不是WPF程序,绑定去哪里了。需要BeginInvoke做的事情是不是可以通过ViewModel里某个属性在后台去完成这个意图的表达。如果你希望ViewModel更稳定,更脱离易变的UI表现的实现。那么可以把ViewModel类的子属性包装成一些类似Setting或者特殊UIConfiguration之类的实现了INotifyPropertyChanged接口的类,只要将来容易分离就好。ViewModel毕竟不是BusinessObject,有些特定的UI实现需要的属性也是应该的。