【问题标题】:WPF Xaml Custom Styling Selected Item Style in a ListBoxWPF Xaml 自定义样式列表框中的选定项样式
【发布时间】:2010-09-26 04:28:56
【问题描述】:

我有一个水平滚动图像的ListBox

我有以下 XAML,我使用 blend 来创建它。它最初在Style TaregetType 行上有一个 x:Key,MSDN 说要删除它,因为我在这方面遇到了错误。现在我收到此错误:

Error 3 Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead.

我不明白如何以这种方式应用所有这些垃圾,我尝试了几件事,但没有任何效果。

我的目标是让所选项目的背景为白色,而不是蓝色。这么小的东西似乎需要做很多工作!

谢谢。

    <ListBox ItemsSource="{Binding Source={StaticResource WPFApparelCollection}}"
        Grid.Row="1" Margin="2,26,2,104" ScrollViewer.VerticalScrollBarVisibility="Hidden"
             ScrollViewer.HorizontalScrollBarVisibility="Hidden" SelectionMode="Single" 
        x:Name="list1" MouseLeave="List1_MouseLeave" MouseMove="List1_MouseMove" Style="{DynamicResource ListBoxStyle1}"  >
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="HorizontalContentAlignment" Value="{Binding Path=HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
            <Setter Property="VerticalContentAlignment" Value="{Binding Path=VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
            <Setter Property="Padding" Value="2,0,0,0"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ListBoxItem}">
                        <Border x:Name="Bd" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}">
                            <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsSelected" Value="true">
                                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                                <Setter Property="Background" TargetName="Bd" Value="#FFFFFFFF"/>
                            </Trigger>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="IsSelected" Value="true"/>
                                    <Condition Property="Selector.IsSelectionActive" Value="false"/>
                                </MultiTrigger.Conditions>
                                <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
                            </MultiTrigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel 
           Orientation="Horizontal" 
           IsItemsHost="True" />
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Image Source="{Binding Image}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

【问题讨论】:

    标签: wpf listbox styles selecteditem


    【解决方案1】:

    我尝试了上述解决方案,但没有按预期工作,所以我找到了另一种解决我的问题的方法,即禁用列表框的选择

    这就是我所做的

    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
             <Setter Property="Focusable" Value="False"/>
         </Style>
    </ListBox.ItemContainerStyle>
    

    【讨论】:

      【解决方案2】:

      使用 ItemContainerStyle 包装样式标签,如下所示:

      <ListBox ItemsSource="{Binding Source={StaticResource WPFApparelCollection}}"
               Grid.Row="1" Margin="2,26,2,104"
               ScrollViewer.VerticalScrollBarVisibility="Hidden"
               ScrollViewer.HorizontalScrollBarVisibility="Hidden" 
               SelectionMode="Single"
               x:Name="list1" MouseLeave="List1_MouseLeave" MouseMove="List1_MouseMove" 
               Style="{DynamicResource ListBoxStyle1}"  >
      
              <ListBox.ItemContainerStyle>
                  <Style TargetType="{x:Type ListBoxItem}">
                      <Setter Property="Background" Value="Transparent"/>
                  </Style>
      <!-- the rest of your code,  but close the ItemContainerStyle -->
              </ListBox.ItemContainerStyle> 
          </ListBox>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多