轉帖|其它|編輯:郝浩|2011-03-10 13:22:41.000|閱讀 1717 次
概述:眾所周知WPF和Silverlight,尤其是Silverlight For WP7總是有點差距的,你會發現對于方法一,Silverlight不支持在Style中的Setter里面設置Binding,對于方法三,Silverlight不知道ItemContainerStyleSelector是神馬玩意,看起來只有方法二能用,但是想實現“在Items集合改變后更新ListBox”的效果,文章最后的方法也不能用,因為CollectionViewSource.GetDefaultView方法在 Silverlight里面也浮云了。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
先展示一下運行效果:
這種效果的控件做起來并不難,而且MSDN上已經有了一篇文章,談到了如何設計一個每行背景色可變的ListView。但是眾所周知WPF和Silverlight,尤其是Silverlight For WP7總是有點差距的,你會發現對于方法一,Silverlight不支持在Style中的Setter里面設置Binding,對于方法三,Silverlight不知道ItemContainerStyleSelector是神馬玩意,看起來只有方法二能用,但是想實現“在Items集合改變后更新ListBox”的效果,文章最后的方法也不能用,因為CollectionViewSource.GetDefaultView方法在Silverlight里面也浮云了。
于是我們采用方法二,派生一個ListBox,然后想辦法動態更新它。
主要的操作步驟如下所示:
1)定義一個命名空間,然后在命名空間下定義一個繼承與listbox控件的類,并重載一些函數,參考代碼如下所示:
namespace listBoxControl //記住個命名空間,我們是要使用這個命名空間
{
public class myColorListBox : ListBox//繼承ListBox控件,并重載基類的屬性
{
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
base.PrepareContainerForItemOverride(element, item);
int index = ItemContainerGenerator.IndexFromContainer(element); // element實際上就是正要顯示的ListBoxItem
ListBoxItem lvi = element as ListBoxItem;
if (index % 2 == 0)
{
lvi.Background = new SolidColorBrush(Colors.Green);//設置偶數情況下,iems項的背景顏色
}
else
{
lvi.Background = new SolidColorBrush(Colors.Red);//設置奇數情況下,listboxItemx項的背景顏色
}
}
//當前選項改變后,觸發的事件
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頁面的前臺代碼,也就是將該命名空間注冊到該頁面的前臺代碼中
xmlns:myLb ="clr-namespace:listBoxControl"//將改行代碼添加到page頁面的前臺代碼中
3)向Page內容容器中注冊從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)進入頁面后臺,編寫邏輯處理代碼
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;//指定數據源,PS,這里僅僅是指定一個簡單的數據源,當然我們可以根據需要進行擴展
mybox.FontSize = 40; //設置item中字體中的大小
}
}
5)所有的代碼準備工作已經書寫完畢,單擊F5或者單擊IDE中的Debug按鈕,就會看到看到上圖中的運行效果!
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:網絡轉載