添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

项目需求,ListBox选中切换其选中项的Image控件的图片,其它每项ListBoxItem的相应Image控件都设置为未选中图片.

解决方案适用于ComboBox等:

1.先看xaml文件:

<DataTemplate x:Name="BusTemplate" x:Key="LBDataTemplate">
     <StackPanel>
          <StackPanel Orientation="Horizontal" Margin="10">
               <TextBlock Text="{Binding BusStr}" VerticalAlignment="Center" FontSize="30" Foreground="White" Width="360"/>
               <Image x:Name="BusStausImage" Source="/Image/d1.png"/>
          </StackPanel>
      </StackPanel>
 </DataTemplate>
 <ListBox ItemsSource="{Binding}" x:Name="BusList" SelectionChanged="ListBox_SelectionChanged" ItemTemplate="{StaticResource LBDataTemplate}">

2.现在要获取上面LisxBox的所有动态绑定项中的控件集合,然后全部换成默认图片。然后把当前选择项的Image换成选中样式的图片

<Image x:Name="BusStausImage" Source="/Image/1.png"/>

3.注册ListBox的SelectionChanged事件

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        //通过函数FindFirstVisualChild遍历LisxBox获取Image集合
        List<Image> imgList = FindFirstVisualChild<Image>(BusList, "BusStausImage");
        foreach (Image img in imgList)
            img.Source = new BitmapImage(new Uri("/Image/车辆/d1.png", UriKind.Relative));
        //获取当前选中项的Image,FindFirstVisualChild2获取单个
        ListBoxItem myListBoxItem = (ListBoxItem)BusList.ItemContainerGenerator.ContainerFromItem(BusList.SelectedItem);
        Image image = FindFirstVisualChild2<Image>(myListBoxItem, "BusStausImage");
        image.Source = new BitmapImage(new Uri("/Image/d2.png", UriKind.Relative));
     catch (Exception)

自定义方法1:FindFirstVisualChild:

//遍历指定容器,根据控件名,返回适配的控件集合
public List<T> FindFirstVisualChild<T>(DependencyObject obj, string childName) where T : DependencyObject
    List<T> childList = new List<T>();
    //遍历指定容器
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
        DependencyObject child = VisualTreeHelper.GetChild(obj, i);
        if (child != null && child is T && child.GetValue(NameProperty).ToString() == childName)
            childList.Add((T)child);
        //如果不存在,则继续遍历指定容器的子容器(则如果指定容器的子容器也就是第二层,遍历存在匹配的控件则跳出。不再遍历其第三层,继续遍历第二层)
            List<T> t2 = FindFirstVisualChild<T>(child, childName);
            if (t2 != null && t2.Count > 0)
                foreach (T t in t2)
                    childList.Add(t);
    return childList;

自定义方法2:FindFirstVisualChild2

//遍历容器,根据控件名,返回第一个适配的控件
 public T FindFirstVisualChild2<T>(DependencyObject obj, string childName) where T : DependencyObject
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
        DependencyObject child = VisualTreeHelper.GetChild(obj, i);
        if (child != null && child is T && child.GetValue(NameProperty).ToString() == childName)
            return (T)child;
            T childOfChild = FindFirstVisualChild2<T>(child, childName);
            if (childOfChild != null)
                return childOfChild;
            return null;

自定义方法3:

//遍历指定容器的所有子控件(包括子控件的子控件),根据指定控件名称,返回控件集合。如果传“”则返回所有子空间的集合
public List<T> GetChildObjects<T>(DependencyObject obj, string name) where T : FrameworkElement
     DependencyObject child = null;
     List<T> childList = new List<T>();
     for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
           child = VisualTreeHelper.GetChild(obj, i);
           if (child is T && (((T)child).Name == name || string.IsNullOrEmpty(name)))
                 childList.Add((T)child);
           childList.AddRange(GetChildObjects<T>(child, ""));//指定集合的元素添加到List队尾
     return childList;

http://social.msdn.microsoft.com/Forums/vstudio/en-US/a01eb1d5-cfc1-47fc-a8e5-45f7f02e8119/wpf-finding-control-inside-itemtemplates-datatemplate?forum=wpf

http://blog.csdn.net/wushang923/article/details/6742378

项目需求,ListBox选中切换其选中项的Image控件的图片,其它每项ListBoxItem的相应Image控件都设置为未选中图片.解决方案适用于ComboBox等:1.先看xaml文件:&lt;DataTemplate x:Name="BusTemplate" x:Key="LBDataTemplate"&gt; &lt;StackPanel&gt; &lt;StackPanel Orientation="Horizontal" Margin="10"&gt; 虽然DataTemplate 是用来绑定的,一般用ONE TWOWAY 来绑定传递或获取数据. 但是今天这个需求真是没办法,在绑定的模板内添加了一个非绑定的数据,需要手动取值. 解决方案原理: https://msdn.microsoft.com/zh-cn/library/bb613579.aspx foreach (var item in F
做项目时找到的方法,引用自http://bbs.csdn.net/topics/390890082,觉得挺好的,保存下来 获取ListBox中的DataTemplate下的每一个button对象的方法如下: private T SearchVisualTree<T>(DependencyObject tarElem) where T : DependencyObject if (tarElem != null) http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/a01eb1d5-cfc1-47fc-a8e5-45f7f02e8119】 How do I programmatically find a control inside an itemtemplates datatemplate, e.g. how do I fin
ListboxItemContainer样式 一般items控件的项模板 很容易 设置DataTemplate就可以了,比如listbox 。但是在选中和失去焦点的时候 却是Windows自带的那种 蓝色下拉框选中效果 ,为了更改这种效果,首先尝试定义控件的itemcontainerstyle: 3 <Setter Property="ItemContainerSt...
WPF中我们可以为自己的数据定制显示方式,虽然数据是一定的,但是DataTemplate模板可以做到让它的表现形式多种多样,这意味着要重写它原来的模板结构。与控件模板不同的是两者应用的不同,DataTemplate模板更多用于Content Control类控件与Items Control类控件。 在ListBox的Item中显示某个成员的姓名、年龄之类的基本信息,点击左边的Name,右边显示...
1.已知item的DataContext,获取ListBoxItem 1)ItemContainerGenerator.ContainerFromItem var selectedItem = DocumentsControl.ItemContainerGenerator.ContainerFromItem(object itemModel) 注:如果开...
  今天给ListBox中通过DataTemplate生成的Button绑定命令时,一开始Button始终找不到绑定的命令。现找到了正确的绑定方式,特来记录一下。   先上个正确的示例:  <ListBox Grid.Column="0" ItemsSource="{Binding CallBussiness}"> <ListBox.ItemsPane...
下面我来自定义类似系统ListBox的MyListBox控件,里面包含模版属性ItemTeamplate。 1、添加新类MyListBox.cs,让它继承自Grid: [TemplatePart(Name = "ItemTemplate", Type = typeof(UIElement))] public class MyListBox : Grid 2、添加ItemTemplate
获取 ListBox 控件中所选的项,可以使用 ListBox 控件的 SelectedItems 属性,它返回一个 SelectedObjectCollection 对象,其中包含所有当前选定的项。 以下是使用 SelectedItems 属性获取 ListBox 所选项的示例代码: ```csharp // 获取 ListBox 控件中选中的项 var selectedItems = listBox1.SelectedItems; // 遍历选中的项并输出它们的文本 foreach (var selectedItem in selectedItems) string itemText = selectedItem.ToString(); Console.WriteLine(itemText); 在上面的示例中,假设 `listBox1` 是您要获取选中项的 ListBox 控件。`listBox1.SelectedItems` 返回一个 SelectedObjectCollection 集合,其中包含所有当前选定的项。在 foreach 循环中,我们遍历选中的项并输出它们的文本。