当CanDrag = True时,无法在列表框中选择项目

时间:2019-05-01 18:42:36

标签: c# uwp

我无法在UWP ListBox中启用拖动(如拖放操作)。当我这样做时,选择将停止工作。

我有一个UWP ListBox,其中包含带有单个TextBlock的ItemTemplate。直到我在ListItem的TextBlock上启用CanDrag(即拖放)后,所有项目的选择都很好。此后,我无法再通过单击列表中的项目来选择ListBox中的项目。我可以通过使用箭头键移动焦点来更改选择,但是不再可以通过鼠标交互进行选择。如果我将CanDrag设置回False,选择将再次开始工作。

我做错什么了吗?

        <ScrollViewer Grid.Column="0" HorizontalScrollMode="Disabled" VerticalScrollMode="Auto">
            <ListBox x:Name="addProcessorListBox" ItemsSource="{Binding ProcessorTypes}"
                     SelectionMode="Single" DoubleTapped="OnDoubleTapped">
                <ListBox.ItemContainerStyle>
                    <Style TargetType="ListBoxItem">
                        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                        <Setter Property="Padding" Value="0" />
                    </Style>
                </ListBox.ItemContainerStyle>
                <ListBox.GroupStyle>
                    <GroupStyle>
                        <GroupStyle.HeaderTemplate>
                            <DataTemplate>
                                <TextBlock Margin="8,2,10,2" Text="{Binding Key}" FontSize="15" FontWeight="Bold"/>
                            </DataTemplate>
                        </GroupStyle.HeaderTemplate>
                    </GroupStyle>
                </ListBox.GroupStyle>
                <ListBox.ItemTemplate>
                    <DataTemplate x:DataType="models:ProcessorType">
                        <TextBlock Grid.Column="0" Margin="18,8,10,8" Text="{Binding DisplayName}" FontSize="15" CanDrag="True" DragStarting="Processor_DragStarting"/>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </ScrollViewer>

我尝试将ListBox更改为ListView,但是仍然存在相同的行为,即单击文本时选择不起作用。

2 个答案:

答案 0 :(得分:0)

我可以重现此问题。我已将其报告给相关团队。他们正在调查这个问题。

作为一种解决方法,可以使用ListView控件,但是不需要将TextBlock拖到其ItemTemplate中。您可以通过设置CanDragItems="True"并处理DragItemsStarting事件来选择拖动整个ListViewItem。

<ListView x:Name="addProcessorListBox" ItemsSource="{Binding ProcessorTypes}"
                 SelectionMode="Single" DoubleTapped="AddProcessorListBox_DoubleTapped" CanDragItems="True" DragItemsStarting="AddProcessorListBox_DragItemsStarting">
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                    <Setter Property="Padding" Value="0" />
                </Style>
            </ListView.ItemContainerStyle>
            <ListView.GroupStyle>
                <GroupStyle>
                    <GroupStyle.HeaderTemplate>
                        <DataTemplate>
                            <TextBlock Margin="8,2,10,2" Text="{Binding Key}" FontSize="15" FontWeight="Bold" />
                        </DataTemplate>
                    </GroupStyle.HeaderTemplate>
                </GroupStyle>
            </ListView.GroupStyle>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Grid.Column="0" Margin="18,8,10,8" Text="{Binding DisplayName}" FontSize="15" />
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
</ListView>

答案 1 :(得分:0)

我们已经确认,最好的方法是ListView,因为我们已经在github示例here中实现了它

实际上,问题与ListBox / ListView并不完全相关,而与

<Setter Property="HorizontalContentAlignment" Value="Stretch" />

以下doc提到Stretch将拉伸子元素以填充父元素分配的空间。但是在这种情况下,父空间的大小是多少?如果指定为“左” /“右” /“中”,则选择不会失败,而只有使用“拉伸”。

实际上这是一个编码问题,您将需要使用该属性来设置parament元素的大小。