最近做一个项目用到ListBox,需要在ListBox中横向动态添加图片,此功能以实现,现在发现一个问题,当点击listbox中的图片时 当点击完一个在点击其他的图片时,上一张图片的选中状态没有取消,我再网上查了一下似乎是ListBox的Bug,请问有没有比较好的解决办法?????

解决方案 »

  1.   

    至今没发现你说的情况,不知道你的代码和Lisbox模板的设置,因此很难定义是否微软的Bug
      

  2.   

    ListBox模板代码
    <ListBox x:Name="lb" Background="Transparent" UIElement.MouseLeftButtonDown="lb_MouseLeftButtonDown"  BorderBrush="Transparent" ItemsSource="{Binding slPic}" Grid.Column="0" Grid.Row="2" ScrollViewer.VerticalScrollBarVisibility="Hidden" Height="170" ItemsPanel="{StaticResource HorizontalTemplate}" ItemTemplate="{StaticResource picDataTemplate}" SelectionMode="Single">
    </ListBox> <Window.Resources>
            <ItemsPanelTemplate x:Key="HorizontalTemplate">
                <StackPanel Orientation="Horizontal" />
            </ItemsPanelTemplate>
            <DataTemplate x:Key="picDataTemplate">
                <Image Source="{Binding slPic}" Height="130" Margin="0.6,0.0,6.0,0.0" Cursor="Hand" MouseLeftButtonDown="Image_MouseLeftButtonDown"/>
            </DataTemplate>
    </Window.Resources>
      

  3.   

    问题出在你的DataTemplate 上,Image上引发了MouseLeftButtonDown事件,但是并没有引发ListBox的SelectChanged事件,因此虽然你点击其他图片,但选中的ListBoxItem没有变,只是触发了另一个图片的MouseLeftButtonDown,在ListBox中放button和TextBox会出现同样问题
      

  4.   

    关于制作图片列表,可以参看微软SilverLight的例子,稍微改一下就可以用到wpf了,以下是主要的xaml代码(要查看完整的代码和示例程序,可以到这里下载):
    <!-- DataTemplate for Photograph instances -->
            <DataTemplate x:Key="PhotographTemplate">
                <Grid Margin="6">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>
                    <Viewbox Height="100" Width="100" VerticalAlignment="Bottom">
                        <Border BorderBrush="#FF999999" BorderThickness="2" Padding="10">
                            <ContentControl Content="{Binding Image}" />
                        </Border>
                    </Viewbox>
                    <ContentControl Grid.Row="1" Content="{Binding Name}" HorizontalAlignment="Center" FontSize="10" />
                </Grid>
            </DataTemplate>        回复内容太长:下续
      

  5.   


    <!-- A smoothed out ListBoxItem style -->
            <Style x:Key="SmoothListBoxItem" TargetType="ListBoxItem">
                <Setter Property="IsEnabled" Value="true" />
                <Setter Property="Foreground" Value="#FF000000" />
                <Setter Property="HorizontalContentAlignment" Value="Left" />
                <Setter Property="VerticalContentAlignment" Value="Top" />
                <Setter Property="Cursor" Value="Arrow" />
                <Setter Property="FontSize" Value="12" />
                <Setter Property="Background" Value="White" />
                <Setter Property="Padding" Value="2,0,0,0" />
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListBoxItem">
                            <Grid Background="{TemplateBinding Background}">
                                <vsm:VisualStateManager.VisualStateGroups>
                                    <vsm:VisualStateGroup x:Name="CommonStates">
                                        <vsm:VisualState x:Name="Normal" />
                                        <vsm:VisualState x:Name="MouseOver">
                                            <Storyboard>
                                                <DoubleAnimation Storyboard.TargetName="HoverOverlay" Storyboard.TargetProperty="Opacity" To=".75" Duration="0" />
                                                <ColorAnimation Storyboard.TargetName="fillStop0Hover" Storyboard.TargetProperty="Color" To="#FFF9FAFA" Duration="0" />
                                                <ColorAnimation Storyboard.TargetName="fillStop1Hover" Storyboard.TargetProperty="Color" To="#FFD6DFE7" Duration="0" />
                                                <ColorAnimation Storyboard.TargetName="fillStop2Hover" Storyboard.TargetProperty="Color" To="#FFD3E4F5" Duration="0" />
                                                <ColorAnimation Storyboard.TargetName="strokeStop0Hover" Storyboard.TargetProperty="Color" To="#00000000" Duration="0" />
                                                <ColorAnimation Storyboard.TargetName="strokeStop1Hover" Storyboard.TargetProperty="Color" To="#00000000" Duration="0" />
                                            </Storyboard>
                                        </vsm:VisualState>
                                    </vsm:VisualStateGroup>
                                    <vsm:VisualStateGroup x:Name="SelectionStates">
                                        <vsm:VisualState x:Name="Unselected" />
                                        <vsm:VisualState x:Name="Selected">
                                            <Storyboard>
                                                <ColorAnimation Storyboard.TargetName="fillStop0" Storyboard.TargetProperty="Color" To="#FFD9EFFF" Duration="0" />
                                                <ColorAnimation Storyboard.TargetName="fillStop1" Storyboard.TargetProperty="Color" To="#FFBDD2E6" Duration="0" />
                                                <ColorAnimation Storyboard.TargetName="fillStop2" Storyboard.TargetProperty="Color" To="#FFA1B6CD" Duration="0" />
                                                <ColorAnimation Storyboard.TargetName="strokeStop0" Storyboard.TargetProperty="Color" To="#FF77B9EB" Duration="0" />
                                                <ColorAnimation Storyboard.TargetName="strokeStop1" Storyboard.TargetProperty="Color" To="#FF4887CD" Duration="0" />
                                            </Storyboard>
                                        </vsm:VisualState>
                                    </vsm:VisualStateGroup>
                                    <vsm:VisualStateGroup x:Name="FocusStates">
                                        <vsm:VisualState x:Name="Focused">
                                            <Storyboard>
                                                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="FocusVisual" Storyboard.TargetProperty="Visibility" Duration="0">
                                                    <DiscreteObjectKeyFrame KeyTime="0">
                                                        <DiscreteObjectKeyFrame.Value>
                                                            <Visibility>Visible</Visibility>
                                                        </DiscreteObjectKeyFrame.Value>
                                                    </DiscreteObjectKeyFrame>
                                                </ObjectAnimationUsingKeyFrames>
                                            </Storyboard>
                                        </vsm:VisualState>
                                        <vsm:VisualState x:Name="Unfocused">
                                            <Storyboard>
                                                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="FocusVisual" Storyboard.TargetProperty="Visibility" Duration="0">
                                                    <DiscreteObjectKeyFrame KeyTime="0">
                                                        <DiscreteObjectKeyFrame.Value>
                                                            <Visibility>Collapsed</Visibility>
                                                        </DiscreteObjectKeyFrame.Value>
                                                    </DiscreteObjectKeyFrame>
                                                </ObjectAnimationUsingKeyFrames>
                                            </Storyboard>
                                        </vsm:VisualState>
                                    </vsm:VisualStateGroup>
                                </vsm:VisualStateManager.VisualStateGroups>                            <Grid.RowDefinitions>
                                    <RowDefinition Height="*"/>
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>                            <Rectangle IsHitTestVisible="False">
                                    <Rectangle.Fill>
                                        <LinearGradientBrush StartPoint="0.316111,0.0165521" EndPoint="0.316111,0.724833">
                                            <GradientStop x:Name="fillStop0" Color="#00000000" Offset="0"/>
                                            <GradientStop x:Name="fillStop1" Color="#00000000" Offset="0.682203"/>
                                            <GradientStop x:Name="fillStop2" Color="#00000000" Offset="1"/>
                                        </LinearGradientBrush>
                                    </Rectangle.Fill>
                                    <Rectangle.Stroke>
                                        <LinearGradientBrush StartPoint="0.318122,0.0360108" EndPoint="0.318122,0.715784">
                                            <GradientStop x:Name="strokeStop0" Color="#00000000" Offset="0"/>
                                            <GradientStop x:Name="strokeStop1" Color="#00000000" Offset="1"/>
                                        </LinearGradientBrush>
                                    </Rectangle.Stroke>
                                </Rectangle>
                                <Rectangle x:Name="HoverOverlay" IsHitTestVisible="False" Opacity="0">
                                    <Rectangle.Fill>
                                        <LinearGradientBrush StartPoint="0.316111,0.0165521" EndPoint="0.316111,0.724833">
                                            <GradientStop x:Name="fillStop0Hover" Color="#00000000" Offset="0"/>
                                            <GradientStop x:Name="fillStop1Hover" Color="#00000000" Offset="0.682203"/>
                                            <GradientStop x:Name="fillStop2Hover" Color="#00000000" Offset="1"/>
                                        </LinearGradientBrush>
                                    </Rectangle.Fill>
                                    <Rectangle.Stroke>
                                        <LinearGradientBrush StartPoint="0.318122,0.0360108" EndPoint="0.318122,0.715784">
                                            <GradientStop x:Name="strokeStop0Hover" Color="#00000000" Offset="0"/>
                                            <GradientStop x:Name="strokeStop1Hover" Color="#00000000" Offset="1"/>
                                        </LinearGradientBrush>
                                    </Rectangle.Stroke>
                                </Rectangle>                            <Border x:Name="FocusVisual" BorderBrush="#FF0B8BAA" BorderThickness="1" CornerRadius="4" Visibility="Collapsed" IsHitTestVisible="False" />
                                <ContentPresenter
                                  Content="{TemplateBinding Content}"
                                  ContentTemplate="{TemplateBinding ContentTemplate}"
                                  HorizontalAlignment="Left" />
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>        <!-- ListBox template that uses a WrapPanel -->
            <Style x:Key="WrapListBox" TargetType="ListBox">
                <Setter Property="ItemContainerStyle" Value="{StaticResource SmoothListBoxItem}" />
                <Setter Property="ItemsPanel">
                    <Setter.Value>
                        <ItemsPanelTemplate>
                            <controlsToolkit:WrapPanel Orientation="Horizontal" />
                        </ItemsPanelTemplate>
                    </Setter.Value>
                </Setter>