C# 如何拖动&;进入Windows Media控件

C# 如何拖动&;进入Windows Media控件,c#,.net,windows,winforms,windows-media-player,C#,.net,Windows,Winforms,Windows Media Player,关于,我想提供将视频文件拖放到windows media控件中的可能性,以便它们自动打开 我已激活AllowDrop属性,但无效 我读过,在wmp控件上使用图像控件可以实现这一点,但如果不在视频控件上显示,我不知道如何实现这一点 谢谢。在MDI窗体或放置视频播放器控件的窗体中,Ok AllowDrop属性应为true。 然后,您可以根据需要放置列表框或标签,并执行以下操作: private void filesListBox_DragEnter(object sender, DragEventA

关于,我想提供将视频文件拖放到windows media控件中的可能性,以便它们自动打开

我已激活AllowDrop属性,但无效

我读过,在wmp控件上使用图像控件可以实现这一点,但如果不在视频控件上显示,我不知道如何实现这一点


谢谢。

在MDI窗体或放置视频播放器控件的窗体中,Ok AllowDrop属性应为true。 然后,您可以根据需要放置列表框或标签,并执行以下操作:

private void filesListBox_DragEnter(object sender, DragEventArgs e)  
{  
    if (e.Data.GetDataPresent(DataFormats.FileDrop, false) == true)  
    {  
        e.Effect = DragDropEffects.All;  
    }  
}  

private void filesListBox_DragDrop(object sender, DragEventArgs e)  
{  
    string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);  

    foreach (string file in files)  
    {  
        //add To Media PLayer
        //Play the files 
    }  
    //Or Handle the first file in string[] and play that file imediatly

} 

最好、更简洁的解决方案是将嵌入式媒体播放器包装在用户控件中,并确保媒体播放器AllowDrop属性设置为“false”,用户控件AllowDrop属性设置为true。使嵌入式媒体播放器停靠以填充用户控件,然后像添加任何用户控件一样将其添加到表单中。当您在表单中选择用户控件时,您将看到DragEnter和DragDrop事件按预期公开。像处理普通控件一样处理它们(Cody提供的代码也可以)。在VB中,您可以在以下链接中看到一个完整的示例(请不要忘记确保用户控件中的实际嵌入式媒体播放器的AllowDrop属性设置为false,否则它将从用户控件包装中“隐藏”拖动事件):

但如果您只想在窗体上的任何位置(包括媒体播放器控件)进行拖放操作,您只需处理嵌入式媒体播放器ActiveX控件容器的DragEnter和DragDrop事件,并确保将实际嵌入式控件的AllowDrop属性设置为False,以免从容器中隐藏拖动事件,并且将容器的AllowDrop设置为true


下面是一些代码,说明如何使用容器的拖动事件来弥补media player ActiveX控件中拖放事件的不足

只需创建一个新表单,将其命名为MainForm,向WMPLib添加所需的引用,使媒体播放器ActiveX控件可用于应用程序,调整其大小,使其宽度大于320像素,高度大于220像素,然后将下面的代码粘贴到主表单代码文件中:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
using WMPLib;
using AxWMPLib;

namespace YourApplicationNamespace
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
            // 40 is the height of the control bar... 320 x 180 is 16:9 aspect ratio
            Panel container = new Panel()
            {
                Parent = this,
                Width = 320,
                Height = 180 + 40,
                AllowDrop = true,
                Left = (this.Width - 320) / 2,
                Top = (this.Height - 180 - 40) / 2,
            };
            AxWindowsMediaPlayer player = new AxWindowsMediaPlayer()
            {
                AllowDrop = false,
                Dock = DockStyle.Fill,
            };
            container.Controls.Add(player);
            container.DragEnter += (s, e) =>
            {
                if (e.Data.GetDataPresent(DataFormats.FileDrop))
                    e.Effect = DragDropEffects.Copy;
            };
            container.DragDrop += (s, e) =>
            {
                if (e.Data.GetDataPresent(DataFormats.FileDrop))
                {
                    string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
                    var file = files.FirstOrDefault();
                    if (!string.IsNullOrWhiteSpace(file))
                        player.URL = file;
                }
            };
        }
    }
}  

现在,您只需将任何媒体文件拖动到窗体中心的media player控件上,它就会将其作为拖放目标并开始播放媒体文件。

这将不允许在media player ActiveX控件上拖放文件,因为它不会公开DragDrop、AllowDrop、DragEnter和任何“与拖动相关”的文件事件/属性。正如kelmer所说,在控件上使用透明图像是一种变通方法,但它非常不雅观。我正在研究一个更好的解决方案,并将在完成后发布。