首页 文章

ListBox展开所选项目

提问于
浏览
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>

1 回答

  • 4

    将您的样式移动到资源并在鼠标位于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的用法,这些是触发器对象变为非活动状态时要应用的操作 .

相关问题