2009-08-19 110 views
3

我有以下代碼片段(複製並粘貼到kaxaml,xamlpad等嘗試它) 摺疊所有,但選定的項目。但是,當鼠標沒有超過ListBox時,我想要恢復到所有可見的 ,並且我無法使其無法繼續使用代碼。我正在使用IsMouseOver ListBox屬性在ListBox上設置選定的項目屬性以嘗試觸發更新,但沒有運氣。 任何想法?列表框展開選定的項目

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Grid> <ListBox Name="lb" Width="100" Height="100" Background="Red" SelectionMode="Single"> <ListBox.ItemsPanel> <ItemsPanelTemplate> <UniformGrid Columns="1"/> </ItemsPanelTemplate> </ListBox.ItemsPanel> <ListBoxItem Background="AliceBlue">Item 1 </ListBoxItem> <ListBoxItem Background="Aquamarine">Item </ListBoxItem> <ListBoxItem Background="Azure">Item </ListBoxItem> <ListBox.ItemContainerStyle> <Style TargetType="{x:Type ListBoxItem}"> <Setter Property="Visibility" Value="Visible"/> <Style.Triggers> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="False"/> <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBox}},Path=SelectedItems.Count}" Value="1"/> </MultiDataTrigger.Conditions> <MultiDataTrigger.EnterActions> <BeginStoryboard> <Storyboard Duration="0:0:1"> <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility"> <DiscreteObjectKeyFrame KeyTime="0:0:1" Value="{x:Static Visibility.Collapsed}"/> </ObjectAnimationUsingKeyFrames> <DoubleAnimation Duration="0:0:1" Storyboard.TargetProperty="Opacity" To="0"/> </Storyboard> </BeginStoryboard> </MultiDataTrigger.EnterActions> </MultiDataTrigger> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True"/> <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBox}},Path=SelectedItems.Count}" Value="1"/> </MultiDataTrigger.Conditions> <MultiDataTrigger.EnterActions> <BeginStoryboard> <Storyboard Duration="0:0:0"> <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility"> <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Visible}"/> </ObjectAnimationUsingKeyFrames> <DoubleAnimation Duration="0:0:0" Storyboard.TargetProperty="Opacity" To="1"/> </Storyboard> </BeginStoryboard> </MultiDataTrigger.EnterActions> </MultiDataTrigger> </Style.Triggers> </Style> </ListBox.ItemContainerStyle> <ListBox.Style> <Style> <Style.Triggers> <Trigger Property="ListBox.IsMouseOver" Value="False"> <Setter Property="ListBox.SelectedItem" Value="{x:Null}"/> <Setter Property="ListBoxItem.IsSelected" Value="False"/> <Setter Property="ListBox.SelectedIndex" Value="-1"/> </Trigger> <EventTrigger RoutedEvent="Mouse.MouseLeave"> <BeginStoryboard> <Storyboard> <Int32Animation Duration="0:0:0" Storyboard.TargetProperty="SelectedIndex" To="-1"/> </Storyboard> </BeginStoryboard> </EventTrigger> </Style.Triggers> </Style> </ListBox.Style> </ListBox> </Grid> </Page>

回答

3

移動你的風格,以資源和應用它當鼠標移動到ListBox.`

<Page.Resources> 
    <Style x:Key="CustomStyle" TargetType="{x:Type ListBoxItem}"> 
     <Style.Triggers> 
      <MultiDataTrigger> 
       <MultiDataTrigger.Conditions> 
        <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="False"/> 
        <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBox}},Path=SelectedItems.Count}" Value="1"/> 
       </MultiDataTrigger.Conditions> 
       <MultiDataTrigger.EnterActions> 
        <BeginStoryboard> 
         <Storyboard Duration="0:0:1"> 
          <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility"> 
           <DiscreteObjectKeyFrame KeyTime="0:0:1" Value="{x:Static Visibility.Collapsed}"/> 
          </ObjectAnimationUsingKeyFrames> 
          <DoubleAnimation Duration="0:0:1" Storyboard.TargetProperty="Opacity" To="0"/> 
         </Storyboard> 
        </BeginStoryboard> 
       </MultiDataTrigger.EnterActions> 
       <MultiDataTrigger.ExitActions> 
        <BeginStoryboard> 
         <Storyboard Duration="0:0:0"> 
          <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility"> 
           <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Visible}"/> 
          </ObjectAnimationUsingKeyFrames> 
          <DoubleAnimation Duration="0:0:0" Storyboard.TargetProperty="Opacity" To="1"/> 
         </Storyboard> 
        </BeginStoryboard> 
       </MultiDataTrigger.ExitActions> 
      </MultiDataTrigger> 
     </Style.Triggers> 
    </Style> 
</Page.Resources> 

<Grid> 
    <ListBox 
     Name="lb" 
     Width="100" 
     Height="100" 
     Background="Red" 
     SelectionMode="Single"> 
     <ListBox.ItemsPanel> 
      <ItemsPanelTemplate> 
       <UniformGrid Columns="1"/> 
      </ItemsPanelTemplate> 
     </ListBox.ItemsPanel> 
     <ListBoxItem Background="AliceBlue">Item 1 
     </ListBoxItem> 
     <ListBoxItem Background="Aquamarine">Item 
     </ListBoxItem> 
     <ListBoxItem Background="Azure">Item 
     </ListBoxItem> 
     <ListBox.Style> 
      <Style> 
       <Style.Triggers> 
        <Trigger Property="ListBox.IsMouseOver" Value="True"> 
         <Setter 
          Property="ListBox.ItemContainerStyle" 
          Value="{StaticResource CustomStyle}"/> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </ListBox.Style> 
    </ListBox> 
</Grid> 

` 還要注意MultiDataTrigger.ExitActions的使用,這些是在觸發器對象變爲非活動狀態時應用的操作。

+0

不錯的解決方案。謝謝! – HiteshP 2009-09-23 21:51:17

+0

我已經完成了這個問題,現在我已經意識到它爲什麼這樣工作:) 原因是動畫在設置依賴屬性時具有最高的優先級。因此,當您使用動畫設置了一些屬性並且想要返回到初始值時,可以使用動畫來完成該操作,就像在MultiDataTrigger.ExitActions元素中所做的那樣。 – 2009-09-27 00:50:50

相關問題