【问题标题】:UWP TreeView how to allow drop for specific itemUWP TreeView如何允许删除特定项目
【发布时间】:2019-10-17 04:06:46
【问题描述】:

使用 UWP TreeView 并处理我需要根据其属性(或类型)实现将一个 TreeView 项拖放到另一个的方案。 例如,我在 TreeView 中有五个节点,其中三个是文件,两个是文件夹。文件项目可以放在文件夹上 - 但反之亦然。我也可以将文件项从文件夹拖到根目录,但不能将文件项放在另一个也是文件的项上。因此,您可以看到 TreeView 项的行为方式有多个用例。 想知道我可以扩展 TreeView 然后覆盖 DragEnter 和 DragLeave 方法,也许我可以检测到被拖动的底层对象和被拖放到的底层对象......但是文档令人困惑,过于笼统且缺乏。 我都检查过的示例认为 TreeView 中的所有项目都相等(因此我可以将文件夹放在文件上,这是不允许的)。

这是我的树视图:

<TreeView   
            x:Name="treeview" Grid.Row="2" ItemsSource="{Binding storageFolders,Mode=OneWay}" 
            Style="{StaticResource TreeViewStyle1}"
            >
            <TreeView.ItemTemplate>
                <DataTemplate x:DataType="localdata:FolderInfo">
                    <TreeViewItem ItemsSource="{x:Bind subFolders}" Content="{x:Bind FolderName}"/>
                </DataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>

这里是 FolderInfo 类型:

    public class FolderInfo : MyBase //INotifyPropertyChanged
{
    private string _FolderName;
    public string FolderName
    {
        get { return _FolderName; }
        set
        {
            if (_FolderName != value)
            {
                _FolderName = value;
                OnPropertyChanged("FolderName");
            }
        }
    }

    private bool _IsFolder;
    public bool IsFolder
    {
        get { return _IsFolder; }
        set
        {
            if (_IsFolder != value)
            {
                _IsFolder = value;
                OnPropertyChanged("IsFolder");
            }
        }
    }

    public ObservableCollection<FolderInfo> subFolders { get; set; } = new ObservableCollection<FolderInfo>();

    public override string ToString()
    {
        return FolderName;
    }
}

Storage 文件夹只是 VM 中的 ObservableCollection:

public ObservableCollection<FolderInfo> storageFolders { get; set; } = new ObservableCollection<FolderInfo>();

【问题讨论】:

  • 您可以通过处理 TreeView_DragItemsCompleted 事件并询问 args.Items 列表来进行验证。
  • @McNline 谢谢。我可以通过 DragItemsCompleted 事件获取我拖动的项目和我已经放弃的项目。但是我怎样才能得到我掉到(目标)上的对象?源项和目标项位于单个 TreeView 中。
  • 这个问题有什么有用的答案吗? Xavier Xie 的回答对我没有帮助,因为所有可用的回调都没有执行,并且没有可能停止节点的删除。

标签: uwp drag-and-drop treeview


【解决方案1】:

您可以首先通过在 DragEnter 事件处理程序中调用 DataPackageView.GetStorageItemsAsync 方法来获取所有 StorageItems。那么IStorageItem接口有一个IsOfType(StorageItemTypes) Method,你可以用它来检查StorageItem是文件夹还是文件。

private async void DropBorder_DragEnter(object sender, Windows.UI.Xaml.DragEventArgs e)
{
    var items = await e.DataView.GetStorageItemsAsync();
    foreach (IStorageItem storageItem in items)
    {
        Debug.WriteLine("IsFolder: " + storageItem.IsOfType(StorageItemTypes.Folder) + " IsFile: " + storageItem.IsOfType(StorageItemTypes.File));
    }
    //TODO:......
}    

【讨论】:

  • 谢谢,但是我的 UWP TreeView 没有执行 DragEnter 事件,所以我无法检查这段代码是如何工作的?
  • @VladacusB 在您的帖子中,您提到了 DragEnter 事件。
  • @VladacusB 如果你不知道如何在 UWP 中进行拖放操作。请阅读Drag and Drop
  • 如前所述,源和目标项在同一个 TreeView 中。在这种情况下,TreeView 上的 DragEnter 不会执行。
  • 请仔细阅读Drag and Drop。即使源项和目标项在同一个 TreeView 中,您仍然可以处理拖放操作。您可以处理 TreeView 的 DragItemsStarting 事件和 TreeViewItem 的 DragEnter 事件。你想过吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-13
  • 2015-12-13
  • 1970-01-01
相关资源
最近更新 更多