Как создать интерфейс перетаскивания для аудио файлов - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь создать интерфейс, который позволяет пользователю перетащить файл mp3 или mp4 и получить путь к файлу.

Я создал прямоугольник для представления области перетаскивания, но я изо всех силс кодом для View Model

<Rectangle x:Name="MyRectangle"
               Width="200"
               Height="200"
               Fill="Gray" 
               Drop="MyRectangle_Drop"
               AllowDrop="True"/>

Ответы [ 2 ]

3 голосов
/ 12 июня 2019

Если вы используете структуру MVVM с Dependency Injection, создайте открытый класс. Вот пример того, что я сделал.

using System.Windows;
using System.Windows.Input;

namespace Test.Common
{
    public class Behaviors
    {
        public static readonly DependencyProperty DropFileCommandProperty =
            DependencyProperty.RegisterAttached("DropFileCommand", typeof(ICommand),
            typeof(Behaviors), new FrameworkPropertyMetadata(
            new PropertyChangedCallback(DropFileCommandChanged)));

        private static void DropFileCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            FrameworkElement element = (FrameworkElement)d;

            element.Drop += Element_DropFile;
        }

        private static void Element_DropFile(object sender, DragEventArgs e)
        {
            FrameworkElement element = (FrameworkElement)sender;

            ICommand command = GeDropFileCommand(element);

            command.Execute(e);
        }


        public static void SetDropFileCommand(UIElement element, ICommand value)
        {
            element.SetValue(DropFileCommandProperty, value);
        }

        public static ICommand GeDropFileCommand(UIElement element)
        {
            return (ICommand)element.GetValue(DropFileCommandProperty);
        }
    }
}

Теперь вы можете ссылаться на ваш класс следующим образом.

<Window x:Class="Test.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:common="clr-namespace:Test.Common"     
        xmlns:prism="http://prismlibrary.com/"        
        prism:ViewModelLocator.AutoWireViewModel="True"
        AllowDrop="True"
        common:Behaviors.DropFileCommand="{Binding DropFile}"
        Title="{Binding Title}">
    <Grid>
    </Grid>
</Window>

Теперь в вашей ViewModel вы можете делать следующее.

using Prism.Commands;
using Prism.Mvvm;
using System.Windows;

namespace Test.Views
{
    public class MainWindowViewModel : BindableBase
    {        
        private string _title = "TestDrop";
        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }

        public MainWindowViewModel()
        {            
            DropFile = new DelegateCommand<DragEventArgs>(dropFile);
        }

        public DelegateCommand<DragEventArgs> DropFile { get; }

        private void dropFile(DragEventArgs obj)
        {
            var files = obj.Data.GetData(DataFormats.FileDrop, true) as string[];

            //implement rest of code here
        }
    }
}
0 голосов
/ 12 июня 2019

В вашем EventRandler MyRectangle_Drop попробуйте этот оператор, чтобы получить каталоги удаленных файлов.

var directories = (string[])e.Data.GetData(DataFormats.FileDrop);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...