XAML WPF列表框项目滚动/设置新位置时,单击并显示下拉菜单不起作用

fcipmucu  于 2023-06-19  发布在  其他
关注(0)|答案(2)|浏览(172)

我有一个ListBox控件,在那里我有一些自定义下拉菜单的自定义项(我几天前的问题-How to show a ListBox item outside the ListBox control and over all other controls on Item click)。
现在,我有一个新的问题,我附上一个视频剪辑。所以,我想我的底部项目的行为,作为一个以上的点击项目。因此,当我点击底部的项目时,我希望上面的项目向上移动,以便显示最后一个项目的下拉菜单。你可以看到,当我点击上面的项目,他们改变了大小,并移动底部的项目,以显示下拉菜单。同样的原则也适用于其他自定义列表框,但这里没有,因为这些自定义项(仅在这里)。请看我发的视频。您可以找到定义项目的数据模板代码。

<DataTemplate x:Key="MYListBoxItemDataTemplate" DataType="{x:Type models:MyType}">
        <StackPanel x:Name="itemsactions" HorizontalAlignment="Center" Height="135">
            <ToggleButton x:Name="choose" Height="52" Margin="0,27,0,0"
                          IsChecked="{Binding IsSelected, Mode=TwoWay, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}"
                          Command="{Binding DataContext.CurrentViewModel.ClickPalletTypeCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
                          CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
                          Style="{DynamicResource CircledTransparentToggleButtonStyle}">
                <Image x:Name="image" VerticalAlignment="Center" Margin="0,0,0,0" Height="52" Stretch="Uniform">
                    <Image.Source>
                        <BitmapImage UriSource="{Binding ImageSource.Regular}"/>
                    </Image.Source>
                </Image>
            </ToggleButton>
            <StackPanel HorizontalAlignment="Center">
                <Label Margin="0,15,0,0" Width="152" HorizontalAlignment="Center" HorizontalContentAlignment="Center" 
                       FontSize="14" FontWeight="SemiBold" 
                       Content="{Binding Weight}" 
                       Style="{DynamicResource LeftLoginTextBoxBlockLabelStyle}"/>
                <Label Margin="0,2,0,0" Width="152" HorizontalAlignment="Center" HorizontalContentAlignment="Center" 
                       FontSize="14" 
                       Content="{Binding Size}" 
                       Style="{DynamicResource LeftLoginTextBoxBlockLabelStyle}"/>
            </StackPanel>
            <StackPanel Margin="0,34,0,0" x:Name="subactions" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Collapsed">
                <ToggleButton x:Name="delete" IsTabStop="False" Width="70"
                              IsChecked="{Binding DataContext.CurrentViewModel.IsDeleteConfirmed, Mode=TwoWay, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
                              Style="{StaticResource DeleteConfirmToggleButtonStyle}"
                              Command="{Binding DataContext.CurrentViewModel.ConfirmDeletePalletTypeCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
                              CommandParameter=""/>
                <Button x:Name="edit" IsTabStop="False" HorizontalAlignment="Left" Height="40" Style="{DynamicResource EditButtonStyle}" Content="Edit"
                        Command="{Binding Path=DataContext.CurrentViewModel.EditPalletTypeCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
                        CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
            </StackPanel>
        </StackPanel>
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding Path=IsChecked, ElementName=choose}" Value="True">
                <Setter Property="Visibility" TargetName="subactions" Value="Visible"/>
                <Setter Property="Height" TargetName="itemsactions" Value="200"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding IsMouseOver, ElementName=choose}" Value="True">
                <Setter Property="Source" TargetName="image" Value="{Binding ImageSource.MouseOver}"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding IsPressed, ElementName=choose}" Value="True">
                <Setter Property="Source" TargetName="image" Value="{Binding ImageSource.Pressed}"/>
                <Setter Property="Visibility" TargetName="subactions" Value="Visible"/>
                <Setter Property="Height" TargetName="itemsactions" Value="200"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding IsChecked, ElementName=choose}" Value="True">
                <Setter Property="Source" TargetName="image" Value="{Binding ImageSource.Choosen}"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding IsEnabled, ElementName=choose}" Value="False">
                <Setter Property="Source" TargetName="image" Value="{Binding ImageSource.Disabled}"/>
                <Setter Property="Height" TargetName="itemsactions" Value="135"/>
            </DataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>

更新-工作控制列表框:

a11xaf1n

a11xaf1n1#

工作控件在展开面板中具有三个元件,与非工作容器中的两个元件相对。这使得ListBoxItem具有更大的高度。看起来这足以触发ListBox将项目滚动到视图中。
你可以尝试两件事:
1.向展开的容器添加第三个元素(或通常增加展开的项目高度)
1.处理ListBox.SelectionChangedToggleButton.Clicked事件,在处理程序中获取选中的项容器并调用FrameworkElement.BringIntoView()。这足以将完整的项目自动滚动到视图中。

<ListBox SelectionChanged="OnSelectionChanged" />
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
  var listBox = sender as ListBox;
  var selectedItemContainer = listBox.ItemContainerGenerator.ContainerFromItem(listBox.SelectedItem) as FrameworkElement;
  selectedItemContainer?.BringIntoView();
}
t2a7ltrp

t2a7ltrp2#

下拉列表存在于切换按钮的父对象“内部”。您正在使用的网格布局可能会调整大小以适应,然后瞧!所有内容都被“正确地”重绘以适应“在父级内部”的新内容。
我没有写太多的xaml(我只是使用事件和编写c#代码...),但我想你需要以某种方式停止调整网格的大小,或者将堆栈面板标记为不可见,而不是按钮父级的子级。
我也不知道该怎么做。

相关问题