为什么拖放文件在 Avalonia 应用程序的窗口中不起作用?

Zol*_*dan 5 c# drag-and-drop avaloniaui avalonia

我正在尝试使用Avalonia 项目中包含的文件来实现拖放。\n由于我无法让它工作,并且我认为这可能是一种特殊情况,因此我尝试制作一个类似的示例,例如ControlCatalogStandalone中的示例。\n虽然ControlCatalogStandalone中的代码按预期工作,但我的测试应用程序中的几乎相同的代码无法正常工作。\ nControlCatalogStandalone中的相关代码属于 UserControl,在我的应用程序中它属于. 这可能是不当行为的原因吗?\n我基于Visual Studio 2019 中的NuGet 包创建了一个新的Avalonia MVVM 应用程序。 \n我也尝试了徒劳的版本。\n这是 XAML 文件:ListBoxWindow
ListBox

MainWindow
0.9.11
0.10.0-preview2

\n
<Window xmlns="https://github.com/avaloniaui"\n        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"\n        xmlns:vm="clr-namespace:DragAndDropTests.ViewModels;assembly=DragAndDropTests"\n        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"\n        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"\n        mc:Ignorable="d" Width="400" Height="200"\n        x:Class="DragAndDropTests.Views.MainWindow"\n        Icon="/Assets/avalonia-logo.ico"\n        Title="DragAndDropTests">\n\n    <Design.DataContext>\n        <vm:MainWindowViewModel/>\n    </Design.DataContext>\n\n    <StackPanel Orientation="Vertical" Spacing="4">\n        <TextBlock Classes="h1">Drag+Drop</TextBlock>\n        <TextBlock Classes="h2">Example of Drag+Drop capabilities</TextBlock>\n\n        <StackPanel Orientation="Horizontal"\n                Margin="0,16,0,0"\n                HorizontalAlignment="Center"\n                Spacing="16">\n            <Border BorderBrush="{DynamicResource ThemeAccentBrush}" BorderThickness="2" Padding="16" Name="DragMe">\n                <TextBlock Name="DragState">Drag Me</TextBlock>\n            </Border>\n            <Border Background="{DynamicResource ThemeAccentBrush2}" Padding="16"\n                    DragDrop.AllowDrop="True">\n                <TextBlock Name="DropState">Drop some text or files here</TextBlock>\n            </Border>\n        </StackPanel>\n    </StackPanel>\n\n</Window>\n
Run Code Online (Sandbox Code Playgroud)\n

这是背后的代码:

\n
using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Markup.Xaml;\nusing System;\nusing System.Diagnostics;\n\nnamespace DragAndDropTests.Views\n{\n    public class MainWindow : Window\n    {\n        private TextBlock _DropState;\n        private TextBlock _DragState;\n        private Border _DragMe;\n        private int DragCount = 0;\n\n        public MainWindow()\n        {\n            Debug.WriteLine("MainWindow");\n            InitializeComponent();\n#if DEBUG\n            this.AttachDevTools();\n#endif\n            _DragMe.PointerPressed += DoDrag;\n\n            AddHandler(DragDrop.DropEvent, Drop);\n            AddHandler(DragDrop.DragOverEvent, DragOver);\n        }\n\n        private async void DoDrag(object sender, Avalonia.Input.PointerPressedEventArgs e)\n        {\n            Debug.WriteLine("DoDrag");\n            DataObject dragData = new DataObject();\n            dragData.Set(DataFormats.Text, $"You have dragged text {++DragCount} times");\n\n            var result = await DragDrop.DoDragDrop(e, dragData, DragDropEffects.Copy);\n            switch (result)\n            {\n                case DragDropEffects.Copy:\n                    _DragState.Text = "The text was copied"; break;\n                case DragDropEffects.Link:\n                    _DragState.Text = "The text was linked"; break;\n                case DragDropEffects.None:\n                    _DragState.Text = "The drag operation was canceled"; break;\n            }\n        }\n\n        private void DragOver(object sender, DragEventArgs e)\n        {\n            Debug.WriteLine("DragOver");\n            // Only allow Copy or Link as Drop Operations.\n            e.DragEffects = e.DragEffects & (DragDropEffects.Copy | DragDropEffects.Link);\n\n            // Only allow if the dragged data contains text or filenames.\n            if (!e.Data.Contains(DataFormats.Text) && !e.Data.Contains(DataFormats.FileNames))\n                e.DragEffects = DragDropEffects.None;\n        }\n\n        private void Drop(object sender, DragEventArgs e)\n        {\n            Debug.WriteLine("Drop");\n            if (e.Data.Contains(DataFormats.Text))\n                _DropState.Text = e.Data.GetText();\n            else if (e.Data.Contains(DataFormats.FileNames))\n                _DropState.Text = string.Join(Environment.NewLine, e.Data.GetFileNames());\n        }\n\n        private void InitializeComponent()\n        {\n            Debug.WriteLine("InitializeComponent");\n            AvaloniaXamlLoader.Load(this);\n\n            _DropState = this.Find<TextBlock>("DropState");\n            _DragState = this.Find<TextBlock>("DragState");\n            _DragMe = this.Find<Border>("DragMe");\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

应用程序内的拖放在ControlCatalogStandalone中运行良好 我的应用程序中运行良好。\n在本例中,
事件的顺序为DoDrag, DragOver, DragOver, \xe2\x80\xa6 。\n \n将文件从 Windows 资源管理器拖到ControlCatalogStandalone效果很好。\n连续的事件是, , \xe2\x80\xa6, \n \n将文件从 Windows 资源管理器拖动到我的应用程序不起作用。\n此处没有调用任何预期事件。\n \n我的测试应用程序有什么问题?Drop


DragOverDragOverDrop




\n