从ListBoxItems中删除控件突出显示,但不删除子控件

时间:2012-11-15 21:39:58

标签: wpf xaml styles

我正在使用ListBox来显示项目列表:PictureOrders。 我已经为ListBox的项目应用了一个DataTemplate。

我想设置列表框的样式,以便当鼠标悬停在列表框中的任何项目上时,项目不会突出显示,因此列表框中的选定项目也不会突出显示。

所以,我在ListBox的资源中使用了以下内容:

  <ListBox.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent"  />
            <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" />
   </ListBox.Resources>

但是,现在ListBox中的ComboBox不再具有突出显示颜色,这会产生一些问题。

我有以下课程:

Public Class PictureOrder
   Public Property OrderName As String
   Public Property NumberOfPictures As Integer
   Public Property QualityOfPictures As Integer
   Public Property Comments As String
End Class

Public Class PictureOrders
   Public Property PictureOrders As ObjectModel.ObservableCollection(Of PictureOrder)

   Public Sub New()
    PictureOrders = New ObjectModel.ObservableCollection(Of PictureOrder)
    For i As Integer = 1 To 11 '
        Dim picOrder As New PictureOrder With {.OrderName = String.Format("Picture Order # {0}", i.ToString),
                                               .NumberOfPictures = 50,
                                               .QualityOfPictures = 10,
                                               .Comments = String.Format("Picture Order # {0} Comments", i.ToString)}
        PictureOrders.Add(picOrder)
    Next
   End Sub
End Class

这是我目前的XAML:

<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Picture Orders" Height="600" Width="600"
xmlns:myProj="clr-namespace:TryingWPF">
<Window.Resources>
    <x:Array x:Key="NumberOfPicturesOptions" Type="sys:Int32"
             xmlns:sys="clr-namespace:System;assembly=mscorlib">
        <sys:Int32>10</sys:Int32>
        <sys:Int32>15</sys:Int32>
        <sys:Int32>20</sys:Int32>
        <sys:Int32>25</sys:Int32>
        <sys:Int32>50</sys:Int32>
        <sys:Int32>100</sys:Int32>
        <sys:Int32>150</sys:Int32>
    </x:Array>
    <x:Array x:Key="QualityOfPicturesOptions" Type="sys:Int32"
              xmlns:sys="clr-namespace:System;assembly=mscorlib">
        <sys:Int32>5</sys:Int32>
        <sys:Int32>6</sys:Int32>
        <sys:Int32>7</sys:Int32>
        <sys:Int32>8</sys:Int32>
        <sys:Int32>9</sys:Int32>
        <sys:Int32>10</sys:Int32>
    </x:Array>
    <myProj:PictureOrders x:Key="Orders" />
</Window.Resources>
<ListBox x:Name="OrderListings" DataContext="{StaticResource Orders}" ItemsSource="{Binding PictureOrders}"  SelectedIndex="0">
    <ListBox.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent"  />
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" />
    </ListBox.Resources>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Expander x:Name="PhotoOrderExpander"
                      Content="{Binding}" 
                      Header="{Binding OrderName}"
                      IsExpanded="{Binding Path=IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}">
                <Expander.ContentTemplate>
                    <DataTemplate>
                        <DockPanel Margin="25,5">
                            <DockPanel DockPanel.Dock="Top">
                                <Label VerticalAlignment="Top" Content="Order Name" />
                                <TextBox Text="{Binding OrderName, ValidatesOnExceptions=True}" VerticalAlignment="Top" MaxLength="50"/>
                            </DockPanel>
                            <DockPanel DockPanel.Dock="Top">
                                <Label Content="NumberOfPictures" />
                                <ComboBox ItemsSource="{Binding Source={StaticResource NumberOfPicturesOptions}}" 
                                          SelectedItem="{Binding Path=NumberOfPictures, ValidatesOnExceptions=True}" />
                            </DockPanel>
                            <DockPanel DockPanel.Dock="Top">
                                <Label Content="Quality Of Pictures" />
                                <ComboBox ItemsSource="{StaticResource QualityOfPicturesOptions}" 
                                          SelectedItem="{Binding Path=QualityOfPictures, ValidatesOnExceptions=True}" />
                            </DockPanel>
                            <DockPanel DockPanel.Dock="Top">
                                <Label Content="Comments" />
                                <TextBox Text="{Binding Comments}" />
                            </DockPanel>
                        </DockPanel>
                    </DataTemplate>
                </Expander.ContentTemplate>
            </Expander>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

2 个答案:

答案 0 :(得分:4)

您可以使用仅定位SolidColorBrush

的样式设置ListBoxItem资源

由于ComboBoxItem继承自ListBoxItem,但ComboBox仍然会受到影响,因此还需要为ComboBoxItem创建一个样式以应用默认颜色。

<ListBox.Resources>
    <Style TargetType="ListBoxItem">
        <Style.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" />
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" />
        </Style.Resources>
    </Style>

    <Style TargetType="ComboBoxItem">
        <Style.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="{x:Static SystemColors.HighlightColor}"/>
             <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="{x:Static SystemColors.ControlColor}"/>
        </Style.Resources>
    </Style>
</ListBox.Resources>

答案 1 :(得分:1)

经过多次尝试解决这个问题后,我终于找到了一个有效的解决方案。

我为ListBoxItem创建了一个样式,用于设置TemplateControl并为MouseOver,Selected和UnSelected状态设置VisualStates。

以下是问题的XAML代码解决方案:

  <Window.Resources>

    <Style TargetType="ListBoxItem" x:Key="ListBoxWithNoSelection">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBoxItem">
                    <Border x:Name="LayoutRoot" 
                        BorderBrush="{TemplateBinding BorderBrush}" 
                        BorderThickness="{TemplateBinding BorderThickness}" 
                        Background="{TemplateBinding Background}" 
                        HorizontalAlignment="{TemplateBinding HorizontalAlignment}" 
                        VerticalAlignment="{TemplateBinding VerticalAlignment}">
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Normal" />
                                <VisualState x:Name="MouseOver" />
                                <VisualState x:Name="Disabled" />
                            </VisualStateGroup>
                            <VisualStateGroup x:Name="SelectionStates">
                                <VisualState x:Name="Unselected" />
                                <VisualState x:Name="Selected" />
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>

                        <ContentControl x:Name="ContentContainer"
                                        ContentTemplate="{TemplateBinding ContentTemplate}" 
                                        Content="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" 
                                        HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                        Margin="{TemplateBinding Padding}" 
                                        VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/>

                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <x:Array x:Key="NumberOfPicturesOptions" Type="sys:Int32"
             xmlns:sys="clr-namespace:System;assembly=mscorlib">
        <sys:Int32>10</sys:Int32>
        <sys:Int32>15</sys:Int32>
        <sys:Int32>20</sys:Int32>
        <sys:Int32>25</sys:Int32>
        <sys:Int32>50</sys:Int32>
        <sys:Int32>100</sys:Int32>
        <sys:Int32>150</sys:Int32>
    </x:Array>
    <x:Array x:Key="QualityOfPicturesOptions" Type="sys:Int32"
              xmlns:sys="clr-namespace:System;assembly=mscorlib">
        <sys:Int32>5</sys:Int32>
        <sys:Int32>6</sys:Int32>
        <sys:Int32>7</sys:Int32>
        <sys:Int32>8</sys:Int32>
        <sys:Int32>9</sys:Int32>
        <sys:Int32>10</sys:Int32>
    </x:Array>
    <myProj:PictureOrders x:Key="Orders" />
</Window.Resources>


<ListBox x:Name="OrderListings" DataContext="{StaticResource Orders}" 
         ItemsSource="{Binding PictureOrders}"  
         SelectedIndex="0"
         ItemContainerStyle="{StaticResource ListBoxWithNoSelection}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Expander x:Name="PhotoOrderExpander"
                      Content="{Binding}" 
                      Header="{Binding OrderName}"
                      IsExpanded="{Binding Path=IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}">
                <Expander.ContentTemplate>
                    <DataTemplate>
                        <DockPanel Margin="25,5">
                            <DockPanel DockPanel.Dock="Top">
                                <Label VerticalAlignment="Top" Content="Order Name" />
                                <TextBox Text="{Binding OrderName, ValidatesOnExceptions=True}" VerticalAlignment="Top" MaxLength="50"/>
                            </DockPanel>
                            <DockPanel DockPanel.Dock="Top">
                                <Label Content="NumberOfPictures" />
                                <ComboBox ItemsSource="{Binding Source={StaticResource NumberOfPicturesOptions}}" 
                                          SelectedItem="{Binding Path=NumberOfPictures, ValidatesOnExceptions=True}" />
                            </DockPanel>
                            <DockPanel DockPanel.Dock="Top">
                                <Label Content="Quality Of Pictures" />
                                <ComboBox ItemsSource="{StaticResource QualityOfPicturesOptions}" 
                                          SelectedItem="{Binding Path=QualityOfPictures, ValidatesOnExceptions=True}" />
                            </DockPanel>
                            <DockPanel DockPanel.Dock="Top">
                                <Label Content="Comments" />
                                <TextBox Text="{Binding Comments}" />
                            </DockPanel>
                        </DockPanel>
                    </DataTemplate>
                </Expander.ContentTemplate>
            </Expander>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

-Frinny