2012-06-06 40 views
0

我有以下XAML一個ListBox:在項目選擇,改變矩形的顏色是在Windows Phone的一個ListBoxItem中的一部分

<ListBox.ItemTemplate> 
    <DataTemplate> 
    <Grid Name="listItemGrid"> 
     <Grid.ColumnDefinitions> 
     <ColumnDefinition MaxWidth="20" MinWidth="20" Width="20" /> 
     <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 
     <Rectangle Name="listItemSideBar" Height="85" HorizontalAlignment="Left" 
     Margin="0, 0, 0, 0" Stroke="{StaticResource PhoneAccentBrush}" 
     StrokeThickness="1" VerticalAlignment="Top" Fill="{StaticResource 
     PhoneAccentBrush}" MinHeight="85" Width="25"/> 
     <StackPanel Margin="0,0,0,17" Grid.Column="1" Grid.ColumnSpan="2"> 
     <TextBlock Name="listItemMainData" Text="{Binding LineTwo}" 
      TextWrapping="NoWrap" Margin="12,0,0,0" Style="{StaticResource 
      PhoneTextExtraLargeStyle}"/> 
     <TextBlock Name="listItemSubData" Text="{Binding LineOne}" 
      TextWrapping="NoWrap" Margin="12,-6,0,0" 
      Style="{StaticResource PhoneTextSubtleStyle}"/> 
     </StackPanel> 
    </Grid> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

當選擇了一個ListBoxItem我想改變這種狀況ListBoxItem中的矩形填充顏色爲不同的顏色;當ListBoxItem被取消選擇時,我想填充顏色改回到PhoneAccentBrush。

有沒有辦法完成這項任務?

回答

0

我終於找出了我在下面複製的解決方案。 ColorHelper類只是從PhoneAccentBrush資源獲取PhoneAccentColor。 DarkPhoneAccentColor通過發現的方法here生成。 PropertyValue<string>(child, "Name")是一種語法糖擴展方法,用於從某個類型的屬性中獲取值;如果該屬性不存在,則返回default(T)

完整的錯誤檢查尚未應用於此代碼。

private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    Color accent = ColorHelper.PhoneAccentColor; 
    Color accentDark = ColorHelper.DarkPhoneAccentColor; 
    foreach (object item in e.RemovedItems) 
     SetListBoxItemColor(item, accentDark); 
    foreach (object item in e.AddedItems) 
     SetListBoxItemColor(item, accent); 
} 

private void SetListBoxItemColor(object item, Color color) 
{ 
    ListBoxItem listBoxItem = listBox.ItemContainerGenerator 
     .ContainerFromItem(item) as ListBoxItem; 
    if (listBoxItem != null) 
    { 
     Rectangle rectangle = GetItemsRecursive<Rectangle>(
      listBoxItem, "listItemSideBar"); 
     SolidColorBrush fillBrush = new SolidColorBrush(); 
     fillBrush.Color = color; 
     rectangle.Fill = fillBrush; 
    } 
} 

private T GetItemsRecursive<T>(DependencyObject lb, string name) 
    where T : DependencyObject 
{ 
    int childrenCount = VisualTreeHelper.GetChildrenCount(lb); 

    for (int i = 0; i < childrenCount; i++) 
    { 
     DependencyObject child = VisualTreeHelper.GetChild(lb, i); 
     if (child is T) 
     { 
      string childName = child.GetType().PropertyValue<string>(child, "Name"); 
      if (String.Compare(childName, name) == 0) 
       return (T)child; 
     } 
     return GetItemsRecursive<T>(child, name); 
    } 
    return default(T); 
} 
相關問題