silverlight中listbox鼠标在上面的时候显示图片
简单说一下,我的listbox里面每一项是由一个大的stackpanel构成,里面再嵌套2个stackpanel
如下模板
<ListBox.ItemTemplate> <DataTemplate> <StackPanel x:Name="bigStackPanel" Orientation="Horizontal" Height="20" VerticalAlignment="Top" Width="380" MouseEnter="StackPanel_MouseEnter" MouseLeave="StackPanel_MouseLeave" Background="Transparent"> <StackPanel x:Name="textStackPanel" Orientation="Horizontal" Width="320"> <TextBlock TextWrapping="Wrap" Text="{Binding Name}" FontSize="15" Height="20" VerticalAlignment="Top"/> <TextBlock TextWrapping="Wrap" Text=" - " FontSize="15" Height="26" VerticalAlignment="Top"/> <TextBlock TextWrapping="Wrap" Text="{Binding Singers.Nmae}" FontSize="15" Height="20" VerticalAlignment="Top"/> </StackPanel> <StackPanel x:Name="picStackPanel" Height="20" Width="50" Orientation="Horizontal" Visibility="Collapsed"> <Image x:Name="pic" Source="/Lark;component/images/delete.png" Width="25" HorizontalAlignment="Right" Visibility="Visible" MouseLeftButtonUp="pic_MouseLeftButtonUp"> <ToolTipService.ToolTip> <TextBlock>删除</TextBlock> </ToolTipService.ToolTip> </Image> <Image x:Name="collect" Source="/Lark;component/images/collect.png" Width="25" HorizontalAlignment="Right" Visibility="Visible" MouseLeftButtonUp="collect_MouseLeftButtonUp"> <ToolTipService.ToolTip> <TextBlock>收藏</TextBlock> </ToolTipService.ToolTip> </Image> </StackPanel> </StackPanel> </DataTemplate> </ListBox.ItemTemplate>
形象一点,弄个效果截图出来...比较丑陋哈,就是左边一个stackpanel放歌曲名字和歌手名字,右边一个stackpanel放2个图片
当鼠标放在上面的时候显示右边的2个图片,2个图片是放在stackpanel里面的,我的是原本隐藏这个stackpanel,然后鼠标悬浮的时候就显示出来。。
由于listbox没有每一项的MouseEnter事件,如果你直接用listbox的事件那么你就要去判断鼠标的位置,然后去知道到底是悬浮在哪一项,然后才可以继续搞下去。
比较麻烦,所以我放弃了这种方法。
但是幸运的是,我每一项listitem 都是由一个大的stackpanel套起来的嘛,所以我就可以用那个stackpanel的MouseEnter事件了。
那就知道到底是悬浮在哪一项了。
但是猥琐的微软,stackpanel这里有个bug,就是你无论有没有设置了宽度,搞出来的宽度还是自动变小了。。
但是当你为它设置了个背景颜色后就奇迹般的正常了,所以只要给它弄个透明的背景颜色就OK了,如上面贴的代码。。
再贴上一个查找嵌套控件里面的控件方法。。。
1 //找控件方法 2 public T FindFirstVisualChild<T>(DependencyObject obj, string childName) where T : DependencyObject 3 { 4 for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) 5 { 6 DependencyObject child = VisualTreeHelper.GetChild(obj, i); 7 if (child != null && child is T && child.GetValue(NameProperty).ToString() == childName) 8 { 9 return (T)child; 10 } 11 else 12 { 13 T childOfChild = FindFirstVisualChild<T>(child, childName); 14 if (childOfChild != null) 15 { 16 return childOfChild; 17 } 18 } 19 } 20 return null; 21 }
思想很简单,就是根据父亲去找儿子,直到找到为止,不用去研究,会用就好。。
下面是使用的例子:
1 private void StackPanel_MouseEnter(object sender, MouseEventArgs e) 2 { 3 StackPanel picStackPanel = FindFirstVisualChild<StackPanel>(sender as StackPanel, "picStackPanel"); 4 5 picStackPanel.Visibility = Visibility.Visible; 6 }
FindFirstVisualChild<StackPanel>(sender as StackPanel, "picStackPanel");
这个方法,参数第一个是个对象,比如我是要找最大的一个stackpanel里面嵌套的一个stackpanel它的ID为picStackPanel,然后把它设置为可见。