【问题标题】:ListBox selection only one item in wpf xamlListBox在wpf xaml中仅选择一项
【发布时间】:2018-05-15 09:18:57
【问题描述】:

我的 WPF 应用程序中有一个 ListBoxListBox 包含 Image 控件、TextBlock 等。当用户单击 ListBox 中的一项时,我只想选择 Image 控件。见附图。我怎样才能喜欢这个选择?

我的代码,

  <ListBox Name="mediaListBox" BorderThickness="0"  SelectionChanged="mediaListBox_SelectionChanged"  ItemsSource="{Binding ThumbnailItems}" SnapsToDevicePixels="True" SelectedItem="{Binding SelectedItem}" Background="Transparent" Drop="ImagePanel_Drop" AllowDrop="true">
            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="IsSelected" Value="True"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </ListBox.ItemContainerStyle>
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel IsItemsHost="True" Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ScrollContentPresenter}}}" >
                    </WrapPanel>
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <StackPanel Width="120">
                            <Grid>
                                <Image Height="90" Source="{Binding Path=Thumbnail}" Margin="0,8,8,0" MouseLeftButtonDown="Image_MouseLeftButtonDown"/>
                                <Button Visibility="{Binding IsVisible,Converter={StaticResource booleanVisibilityConverter}, FallbackValue=Hidden,UpdateSourceTrigger=PropertyChanged}" Style="{DynamicResource CloseButton}" HorizontalAlignment="Right" VerticalAlignment="Top" Command="{Binding ElementName=mediaListBox,Path=DataContext.RemoveGallaryItemCommand}" CommandParameter="{Binding SelectedItem}"  Width="16" Height="16" Content="x"></Button>
                            </Grid>
                            <TextBlock TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White" Text="{Binding Path=Name}" >
                                <TextBlock.ToolTip>
                                    <ToolTip Visibility="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget, Converter={StaticResource trimmedVisibilityConverter}}">
                                        <ToolTip.Content>
                                            <TextBlock Text="{Binding Name}"/>
                                        </ToolTip.Content>
                                    </ToolTip>
                                </TextBlock.ToolTip>
                            </TextBlock>
                        </StackPanel>
                    </StackPanel>

                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

目前,

【问题讨论】:

    标签: c# wpf listbox


    【解决方案1】:

    您可以为ListBoxItem 容器定义自定义ControlTemplate,例如:

    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListBoxItem">
                        <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" 
                                        BorderThickness="{TemplateBinding BorderThickness}" 
                                        Background="{TemplateBinding Background}" 
                                        SnapsToDevicePixels="true">
                            <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                              SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
                                              VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="BorderBrush" Value="Green" />
                </Trigger>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="BorderBrush" Value="Green" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>
    

    【讨论】:

    • 好的,很好。但是我怎样才能只为图像控制设置边框呢?不选择所有项目。只为图像控制选择边框。
    • 是的,我试过了。边框完美,但它涵盖了所有项目,我只需要边框单个图像,看起来像附加的图像。
    • 您应该在您在 ItemTemplate 中定义的每个项目周围设置一个边框。请张贴您当前看到的屏幕截图。
    • 已更新,请查看。
    • 然后你应该添加一个 Border 元素到你的 ItemTemplate 并使用绑定到父 ListBoxItem 容器的 IsSelected 属性的 DataTrigger,正如我在这里建议的那样:stackoverflow.com/questions/50323638/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多