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,然后把它设置为可见。

 

posted @ 2012-10-11 10:17  瘦鸟先飞  阅读(740)  评论(0编辑  收藏  举报