WPF [VB]将选定的ListViewItem置于前面并与其他ListViewItem重叠

时间:2018-04-07 15:42:18

标签: wpf vb.net listview overlap

我正在使用Treeview和Listview在我的WPF应用程序中创建一个资源管理器控件。对于Listview,我想使用32x32像素图标显示所选文件夹的内容。为了实现这一点,我有以下XAML,它也截断TextBlock中的长文件/文件夹名称:

return this.httpClient.get<Object[]>(queryUrl).pipe(
    map(response => response.map(data => new SearchResult{
        id: item.id.videoId,
        title: item.snippet.title,
        description: item.snippet.description,
        thumbnailUrl: item.snippet.thumbnails.high.url,
      })),
    tap(...),
    catchError(...)
    )
}

当选择ListViewItem时,我希望它与下面的项(文件/文件夹)重叠,而不是当前行为,即增加WrapPanel当前行中所有ListViewItem的高度。

要访问ListViewItem,我使用以下代码,以便在选择项目时显示TextBlock中的所有文本:

<ListView x:Name="LV_Explore"
    Grid.Column="2"
    BorderThickness="0"
    VerticalContentAlignment="Top"
    ItemsSource="{Binding Path=., Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    ScrollViewer.HorizontalScrollBarVisibility="Disabled"
    ScrollViewer.VerticalScrollBarVisibility="Visible"
    AllowDrop="True">
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel x:Name="SP_ExploreItem"
                Width="42">
                <Image Source="{Binding LargeIcon, UpdateSourceTrigger=PropertyChanged}"
                    Margin="0,0,0,2" />
                <TextBlock x:Name="TXT_ExploreItem"
                    Width="42"
                    Height="42"
                    TextOptions.TextFormattingMode="Display"
                    TextAlignment="Center"
                    TextWrapping="Wrap"
                    TextTrimming="WordEllipsis"
                    LineStackingStrategy="BlockLineHeight"
                    Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" />
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

作为参考我希望实现类似于桌面的行为,例如:屏幕截图1:Normal state屏幕截图2:Selected state

虽然我目前正常状态正常,所选状态如下所示:屏幕截图3:Listview selected state

我怀疑我可能需要在ListView控件的ItemsPanelTemplate中使用WrapPanel更改为Canvas,这将失去在Listview中自动排列和包装项目的行为。因此,我正在寻找最佳方法的建议,以便维护布局并允许我在选择时重叠项目。

谢谢, 杰

1 个答案:

答案 0 :(得分:0)

正如您可能已经意识到的那样,listview项目中的某些内容位于某种框内,并且它没有出现。如果你不让它成长,它将被截断或削减。 画布不会剪辑,以便勾选您需求的一个框,您必须编写基于画布或基本面板控件的自定义面板,并编写您自己的度量/编排代码。 这是非常重要的,任何滚动都可能使它更复杂,但你可以看看人们的工作: 例如 https://www.codeproject.com/Articles/37348/Creating-Custom-Panels-In-WPF

或者,您可以使用装饰器。 adorner图层位于窗口中的其他所有内容之上,但仍与其关联的相同datacontext相同。 这些都不是那么容易使用,但你可以再将代码建立在其他人的基础上:

http://www.nbdtech.com/Blog/archive/2010/07/12/wpf-adorners-part-4-ndash-simple-and-powerful-system-for.aspx

如果我按照你想要的正确方式,装饰师可能是我的第一个候选人。

现在没有多少人使用vb,我担心你每次看到他们是c#的样本时都会发现很多。