3

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

MainWindow
基于0.9.11Visual Studio 2019 中的 NuGet 包。
我也尝试过版本0.10.0-preview2
这是 XAML 文件:

<Window xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="clr-namespace:DragAndDropTests.ViewModels;assembly=DragAndDropTests"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d" Width="400" Height="200"
        x:Class="DragAndDropTests.Views.MainWindow"
        Icon="/Assets/avalonia-logo.ico"
        Title="DragAndDropTests">

    <Design.DataContext>
        <vm:MainWindowViewModel/>
    </Design.DataContext>

    <StackPanel Orientation="Vertical" Spacing="4">
        <TextBlock Classes="h1">Drag+Drop</TextBlock>
        <TextBlock Classes="h2">Example of Drag+Drop capabilities</TextBlock>

        <StackPanel Orientation="Horizontal"
                Margin="0,16,0,0"
                HorizontalAlignment="Center"
                Spacing="16">
            <Border BorderBrush="{DynamicResource ThemeAccentBrush}" BorderThickness="2" Padding="16" Name="DragMe">
                <TextBlock Name="DragState">Drag Me</TextBlock>
            </Border>
            <Border Background="{DynamicResource ThemeAccentBrush2}" Padding="16"
                    DragDrop.AllowDrop="True">
                <TextBlock Name="DropState">Drop some text or files here</TextBlock>
            </Border>
        </StackPanel>
    </StackPanel>

</Window>

这是背后的代码:

using Avalonia;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Markup.Xaml;
using System;
using System.Diagnostics;

namespace DragAndDropTests.Views
{
    public class MainWindow : Window
    {
        private TextBlock _DropState;
        private TextBlock _DragState;
        private Border _DragMe;
        private int DragCount = 0;

        public MainWindow()
        {
            Debug.WriteLine("MainWindow");
            InitializeComponent();
#if DEBUG
            this.AttachDevTools();
#endif
            _DragMe.PointerPressed += DoDrag;

            AddHandler(DragDrop.DropEvent, Drop);
            AddHandler(DragDrop.DragOverEvent, DragOver);
        }

        private async void DoDrag(object sender, Avalonia.Input.PointerPressedEventArgs e)
        {
            Debug.WriteLine("DoDrag");
            DataObject dragData = new DataObject();
            dragData.Set(DataFormats.Text, $"You have dragged text {++DragCount} times");

            var result = await DragDrop.DoDragDrop(e, dragData, DragDropEffects.Copy);
            switch (result)
            {
                case DragDropEffects.Copy:
                    _DragState.Text = "The text was copied"; break;
                case DragDropEffects.Link:
                    _DragState.Text = "The text was linked"; break;
                case DragDropEffects.None:
                    _DragState.Text = "The drag operation was canceled"; break;
            }
        }

        private void DragOver(object sender, DragEventArgs e)
        {
            Debug.WriteLine("DragOver");
            // Only allow Copy or Link as Drop Operations.
            e.DragEffects = e.DragEffects & (DragDropEffects.Copy | DragDropEffects.Link);

            // Only allow if the dragged data contains text or filenames.
            if (!e.Data.Contains(DataFormats.Text) && !e.Data.Contains(DataFormats.FileNames))
                e.DragEffects = DragDropEffects.None;
        }

        private void Drop(object sender, DragEventArgs e)
        {
            Debug.WriteLine("Drop");
            if (e.Data.Contains(DataFormats.Text))
                _DropState.Text = e.Data.GetText();
            else if (e.Data.Contains(DataFormats.FileNames))
                _DropState.Text = string.Join(Environment.NewLine, e.Data.GetFileNames());
        }

        private void InitializeComponent()
        {
            Debug.WriteLine("InitializeComponent");
            AvaloniaXamlLoader.Load(this);

            _DropState = this.Find<TextBlock>("DropState");
            _DragState = this.Find<TextBlock>("DragState");
            _DragMe = this.Find<Border>("DragMe");
        }
    }
}

应用程序中的拖放ControlCatalogStandalone 我的应用程序中运行良好。在这种情况下
,事件的连续性是DoDrag, DragOver, DragOver, ...。 将文件从 Windows 资源管理器拖到ControlCatalogStandalone效果很好。 事件的连续性是, , ..., 将文件从 Windows 资源管理器拖动到我的应用程序不起作用。 这里没有调用任何预期的事件。 我的测试应用程序有什么问题?Drop


DragOverDragOverDrop




4

0 回答 0