2010-08-29 2 views
4

У меня есть список в стиле. Элементы Listbox меняют цвет при зависании и при выборе. Наведите указатель мыши и выберите режим работы. Но когда вы выбираете элемент, а затем вынимаете мышь и возвращаетесь, чтобы навести курсор на него, он возвращает его обратно в режим наведения/невыделения, даже если он все еще выбран. Как я могу сохранить listboxitem в «выбранном» визуальном состоянии?Пользовательский стиль списка - как я могу сохранить стиль для выбранного элемента?

<Style x:Name="myListBoxItemStyle" TargetType="ListBoxItem"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ListBoxItem"> 
       <Border x:Name="myBorder" CornerRadius="5" BorderThickness="3" Background="#FF292121" Margin="0"> 
        <Grid HorizontalAlignment="Stretch"> 
         <ContentPresenter Content="{TemplateBinding Content}" Margin="5,0,5,0" /> 
        </Grid> 
        <VisualStateManager.VisualStateGroups> 
         <VisualStateGroup x:Name="CommonStates"> 
          <VisualState x:Name="Normal"/> 
          <VisualState x:Name="MouseOver"> 
           <Storyboard> 
            <ColorAnimation Storyboard.TargetName="myBorder" Storyboard.TargetProperty="(Background).(SolidBrush.Color)" Duration="00:00:00.2" To="#FF949290" /> 
           </Storyboard> 
          </VisualState> 
          <VisualState x:Name="Disabled"/> 
         </VisualStateGroup> 
         <VisualStateGroup x:Name="SelectionStates"> 
          <VisualState x:Name="Unselected" /> 
          <VisualState x:Name="Selected"> 
           <Storyboard> 
            <ColorAnimation Storyboard.TargetName="myBorder" Storyboard.TargetProperty="(Background).(SolidBrush.Color)" Duration="00:00:00.2" To="#FF949290" /> 
           </Storyboard> 
          </VisualState> 
          <VisualState x:Name="SelectedUnfocused"/> 
         </VisualStateGroup> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<Style x:Key="myListBoxStyle" TargetType="ListBox"> 
    <Setter Property="Background" Value="Transparent"/> 
    <Setter Property="Margin" Value="0"/> 
    <Setter Property="BorderThickness" Value="0"/> 
    <Setter Property="ItemContainerStyle" Value="{StaticResource myListBoxItemStyle}"/> 
    <Setter Property="VerticalAlignment" Value="Bottom"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ListBox"> 
       <Grid Margin="0"> 
        <ItemsPresenter /> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="ItemsPanel"> 
     <Setter.Value> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal"/> 
      </ItemsPanelTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<ListBox Name="theControl" Style="{StaticResource myListBoxStyle}" /> 

ответ

8

Что происходит ваши состояния (выбранные и mousover) из различных государственных групп конкурирует за то же свойство (myBorders фонового). Вам нужно будет добавить еще один элемент (возможно, прямоугольник) и изменить фон элементов в одном из состояний.

Как правило, вы не должны управлять одним и тем же свойством одного и того же элемента из состояний в разных группах состояний. Менеджер визуального состояния не знает, как справиться с этой ситуацией, поскольку он не знает, какое состояние должно иметь приоритет.

+1

Спасибо. Должен был подумать об этом. Для всех, кто сталкивается с подобной проблемой, я добавил еще одну границу внутри первой с той же формой и анимированную от прозрачного до цвета, когда она выбрана. Теперь отлично. – Adam

+0

Действительно классный раствор! Благодаря.. –

Смежные вопросы