WPF控件:像收藏夹栏一样

6
我正在尝试弄清楚IE / Firefox等收藏夹栏是什么控件。基本上,它是一种可视化存储书签、轻松移动和删除的东西。
我尝试使用ToolBar做了些事情,虽然我可以添加按钮并使它们像我想要的那样工作,但删除和重新排列它们是有问题的。我也尝试了listviews,但让它们正确显示证明很困难。也许类似于大图标视图,不带图标的东西。
我只是在寻找一个人们可以将导航页面添加到其中以便回到之前查看的页面的地方。
编辑:
我想我并不真的在意重新排列这么多。我只是试图弄清楚如何:
  1. 通过编程方式添加它们
  2. 使它们可点击,并具有单击事件
  3. 在不再需要它们时将其删除
我已经尝试过以下内容作为测试:
    <ListView Grid.Row="1" Name="ListView1">
        <WrapPanel>
            <WrapPanel.ContextMenu>
                <ContextMenu>
                    <MenuItem Name="mnuDelete" Header="Delete" />
                </ContextMenu>
            </WrapPanel.ContextMenu>
            <Button Name="AddSite">+</Button>
            <ListViewItem Content="Test 1" />
            <ListViewItem Content="Test 2" />
        </WrapPanel>
    </ListView>

但是我甚至不能选择列表项中的任何一个,更别说单击它们了。如果我右键单击其中一个,上下文菜单事件处理程序也不告诉我我点击的是哪个。
这很令人沮丧,因为在WinForms中,我已经完成了这个任务。我不能等待自己足够熟练以至于WPF开始自动运行。我感觉好像又从VB6转到VB.Net一样,但更甚。


这只是一个带有拖放支持的ListBox。而重新排列是最困难的部分。我记得有一些文章,但将它们应用到自己的列表框并不容易。 - vortexwolf
我还没有在WPF中尝试过ListBoxes。一个ListBox比ListView更好吗?这似乎类似于选择图标视图的ListView。 - AndyD273
实际上,在WPF中,ListView和ListBox几乎是相同的。ListView继承自ListBox,它只添加了一个View属性,您可以使用该属性来分配预定义的布局(如GridView)。 - Thomas Levesque
我真的需要好好学习这些东西,也许要买一两本书...虽然有很多自定义功能,但我现在错过了内置功能,或者至少要学习新的名称/思维模式来替代它们。 - AndyD273
1个回答

1

所以我认为我已经按照自己的意愿使其正常工作,除了重新排序之外。
现在我可以暂时忍受这种情况。

XAML:

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Tracks" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="20" />
            <RowDefinition Height="26" />
            <RowDefinition Height="265*" />
        </Grid.RowDefinitions>
        <Menu Name="Menu1" />
        <Frame Grid.Row="2" Name="Frame1" Source="PageSearchResults.xaml" />
        <StackPanel Orientation="Horizontal" Grid.Row="1">
        <Button Name="AddSite">+</Button>
        <ListView Name="ListView1" MouseDoubleClick="ListViewItem_MouseDoubleClick">
            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>
            <ListView.ContextMenu>
                <ContextMenu>
                    <MenuItem Name="mnuDelete" Header="Delete" />
                </ContextMenu>
            </ListView.ContextMenu>
        </ListView>
        </StackPanel>
    </Grid>
</Window>

VB:

Class MainWindow 
    Dim bookmarks As New ArrayList

    Private Sub mnuDelete_click(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles mnuDelete.Click
        If Not ListView1.SelectedValue Is Nothing Then
            bookmarks.RemoveAt(ListView1.SelectedValue)
        End If
        ListView1.Items.RemoveAt(ListView1.SelectedIndex)
    End Sub

    Private Sub AddSite_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles AddSite.Click
        Dim i As Integer = 0
        Dim itmX As Integer
        Dim itm As New ListViewItem
        i = bookmarks.Add(Frame1.Content)
        itmX = ListView1.Items.Add(New DictionaryEntry(i, Frame1.Content.title))
        ListView1.DisplayMemberPath = "Value"
        ListView1.SelectedValuePath = "Key"
    End Sub

    Private Sub ListViewItem_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseButtonEventArgs)
        If Not ListView1.SelectedValue Is Nothing Then
            Frame1.Content = bookmarks(ListView1.SelectedValue)
        End If
    End Sub
End Class

这样就可以在带有框架和列表视图的WPF窗口中添加和删除书签。我乐意听取改进建议或更好的方法。


1
我会添加ItemTemplate实现(一个带有图片和工具提示中的URL的文本)。此外最好使用ObservableCollection类,您可以将其绑定到ListView并从集合中添加或删除项目,而不是从实际控件中。 ListView.*Path属性可以在xaml中一次设置。选定的项并不总是等于单击的项,请尝试使用正确的转换调用sender.Parent.PlacementTarget.DataContext。经过一段时间,您会注意到几乎所有事情都可以在没有事件和代码后台的情况下完成。 - vortexwolf
哇,我有很多东西要学。Observable collections看起来很有趣,但是设置用于保存数据的类似乎需要大量工作,特别是如果您需要跟踪许多列表框。再加上大多数列表框仅在一个页面上使用,这似乎使得类(主要用于可重用性)成为一个有趣的选择。因此,要么使用实际上可以重复使用但不太好用的通用类,要么使用很多好的类...还有更多阅读要做。 - AndyD273
你对可重复使用的独立类的想法很正确。这种方法被称为MVVM(Model-View-ViewModel),现在几乎成为构建WPF应用程序的标准。 - vortexwolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接