轉(zhuǎn)帖|其它|編輯:郝浩|2011-03-10 13:22:41.000|閱讀 1717 次
概述:眾所周知WPF和Silverlight,尤其是Silverlight For WP7總是有點(diǎn)差距的,你會(huì)發(fā)現(xiàn)對(duì)于方法一,Silverlight不支持在Style中的Setter里面設(shè)置Binding,對(duì)于方法三,Silverlight不知道ItemContainerStyleSelector是神馬玩意,看起來只有方法二能用,但是想實(shí)現(xiàn)“在Items集合改變后更新ListBox”的效果,文章最后的方法也不能用,因?yàn)镃ollectionViewSource.GetDefaultView方法在 Silverlight里面也浮云了。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
先展示一下運(yùn)行效果:
這種效果的控件做起來并不難,而且MSDN上已經(jīng)有了一篇文章,談到了如何設(shè)計(jì)一個(gè)每行背景色可變的ListView。但是眾所周知WPF和Silverlight,尤其是Silverlight For WP7總是有點(diǎn)差距的,你會(huì)發(fā)現(xiàn)對(duì)于方法一,Silverlight不支持在Style中的Setter里面設(shè)置Binding,對(duì)于方法三,Silverlight不知道ItemContainerStyleSelector是神馬玩意,看起來只有方法二能用,但是想實(shí)現(xiàn)“在Items集合改變后更新ListBox”的效果,文章最后的方法也不能用,因?yàn)镃ollectionViewSource.GetDefaultView方法在Silverlight里面也浮云了。
于是我們采用方法二,派生一個(gè)ListBox,然后想辦法動(dòng)態(tài)更新它。
主要的操作步驟如下所示:
1)定義一個(gè)命名空間,然后在命名空間下定義一個(gè)繼承與listbox控件的類,并重載一些函數(shù),參考代碼如下所示:
namespace listBoxControl //記住個(gè)命名空間,我們是要使用這個(gè)命名空間
{
public class myColorListBox : ListBox//繼承ListBox控件,并重載基類的屬性
{
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
base.PrepareContainerForItemOverride(element, item);
int index = ItemContainerGenerator.IndexFromContainer(element); // element實(shí)際上就是正要顯示的ListBoxItem
ListBoxItem lvi = element as ListBoxItem;
if (index % 2 == 0)
{
lvi.Background = new SolidColorBrush(Colors.Green);//設(shè)置偶數(shù)情況下,iems項(xiàng)的背景顏色
}
else
{
lvi.Background = new SolidColorBrush(Colors.Red);//設(shè)置奇數(shù)情況下,listboxItemx項(xiàng)的背景顏色
}
}
//當(dāng)前選項(xiàng)改變后,觸發(fā)的事件
protected override void OnItemsChanged(System.Collections.
Specialized.NotifyCollectionChangedEventArgs e)
{
base.OnItemsChanged(e);
if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
{
for (int i = e.OldStartingIndex; i < Items.Count; i++)
{
ListBoxItem lvi = ItemContainerGenerator.ContainerFromIndex(i) as ListBoxItem;
if (i % 2 == 0)
{
lvi.Background = new SolidColorBrush(Colors.Green);
}
else
{
lvi.Background = new SolidColorBrush(Colors.Red);
}
}
}
}
}
}
2)將該命名空間添加到Page頁面的前臺(tái)代碼,也就是將該命名空間注冊到該頁面的前臺(tái)代碼中
xmlns:myLb ="clr-namespace:listBoxControl"//將改行代碼添加到page頁面的前臺(tái)代碼中
3)向Page內(nèi)容容器中注冊從listBox派生的控件類,參考代碼如下所示
<!--ContentPanel - place additional content here-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
//這一步的myLb和第二部的中的myLb是一致的,在這里我們可以像操作基類Listbox一樣操作此處的派生類
<myLb:myColorListBox x:Name="mybox" Margin="0,6,0,-6"></myLb:myColorListBox>
</Grid>
4)進(jìn)入頁面后臺(tái),編寫邏輯處理代碼
public partial class colorChangedPage : PhoneApplicationPage
{
public colorChangedPage()
{
InitializeComponent();
//
List <string> tt = new System.Collections.Generic.List<string>();
tt.Add( "xingchen");
tt.Add( "xiaohua");
tt.Add( "xiaoming");
mybox.ItemsSource = tt;//指定數(shù)據(jù)源,PS,這里僅僅是指定一個(gè)簡單的數(shù)據(jù)源,當(dāng)然我們可以根據(jù)需要進(jìn)行擴(kuò)展
mybox.FontSize = 40; //設(shè)置item中字體中的大小
}
}
5)所有的代碼準(zhǔn)備工作已經(jīng)書寫完畢,單擊F5或者單擊IDE中的Debug按鈕,就會(huì)看到看到上圖中的運(yùn)行效果!
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載