.net 如何将文件放到列表框内的WPF图像控件上

.net 如何将文件放到列表框内的WPF图像控件上,.net,wpf,xaml,.net,Wpf,Xaml,我有一个带有以下xaml的WPF窗口: <Window x:Class="WpfApplication2.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width

我有一个带有以下xaml的WPF窗口:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

    <Window.Resources>
        <Style TargetType="Border" x:Key="BorderStyle">
            <Setter Property="BorderBrush" Value="Black"/>
            <Setter Property="BorderThickness" Value="1"/>
        </Style>
        <Style TargetType="Image" x:Key="ImageStyle">
            <Setter Property="Height" Value="75"/>
            <Setter Property="Width" Value="75"/>
            <Setter Property="AllowDrop" Value="True"/>
        </Style>
    </Window.Resources>
    <Grid>
        <GroupBox>
            <Grid>
                <ListBox x:Name="listbox">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal" >
                                <TextBlock Text="{Binding}"/>
                                <Border Style="{StaticResource BorderStyle}">
                                    <Image Style="{StaticResource ImageStyle}" Drop="ThisDrop"/>
                                </Border>
                                <Border Style="{StaticResource BorderStyle}">
                                    <Image Style="{StaticResource ImageStyle}" Drop="ThatDrop"/>
                                </Border>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </Grid>
        </GroupBox>
    </Grid>
</Window>
当我从windows资源管理器将文件拖放到图像控件上时,我很难启动这些拖放事件

项目:
这里有一个基本的拖放操作:

private void Image_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        // Signal the user they can copy files here
        e.Effects = DragDropEffects.Copy;
        e.Handled = true;
    }
}

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

    if (fileList != null)
    {
        foreach (string file in fileList)
        {
            // Do stuff
        }

        e.Handled = true;
    }
}
我通常实现DragOver,让DragEnter简单地调用DragOver,因为有时我发现DragEnter事件并不总是触发。但这是在使用Windows窗体,对于WPF可能不是必需的

设置DragDropEffects有两个作用。它会更改图标,以便用户可以看到将要发生的事情(复制、移动等)。它还告诉调用方(启动拖放的应用程序)发生了什么,以便知道如何做出反应。例如,对于移动操作,它可能会删除原始文件


您可以使用e.AllowedEffects查看调用方应用程序支持的效果。例如,它可能不支持移动,只支持复制。这取决于两端的开发人员,以确保他们的应用程序符合链接、移动和复制的含义。就API而言,它只影响显示给用户的图标。

这里有一个基本的拖放操作:

private void Image_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        // Signal the user they can copy files here
        e.Effects = DragDropEffects.Copy;
        e.Handled = true;
    }
}

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

    if (fileList != null)
    {
        foreach (string file in fileList)
        {
            // Do stuff
        }

        e.Handled = true;
    }
}
我通常实现DragOver,让DragEnter简单地调用DragOver,因为有时我发现DragEnter事件并不总是触发。但这是在使用Windows窗体,对于WPF可能不是必需的

设置DragDropEffects有两个作用。它会更改图标,以便用户可以看到将要发生的事情(复制、移动等)。它还告诉调用方(启动拖放的应用程序)发生了什么,以便知道如何做出反应。例如,对于移动操作,它可能会删除原始文件

您可以使用e.AllowedEffects查看调用方应用程序支持的效果。例如,它可能不支持移动,只支持复制。这取决于两端的开发人员,以确保他们的应用程序符合链接、移动和复制的含义。就API而言,它只影响向用户显示的图标。

尝试以下方法:


下面是事件处理程序的
Drop

private void ImageDrop1(对象发送方,DragEventArgs e)
{
MessageBox.Show(“放到图1上”);
e、 已处理=正确;
}
私有void ImageDrop2(对象发送方,DragEventArgs e)
{
MessageBox.Show(“放到图2上”);
e、 已处理=正确;
}
试试这个:


下面是事件处理程序的
Drop

private void ImageDrop1(对象发送方,DragEventArgs e)
{
MessageBox.Show(“放到图1上”);
e、 已处理=正确;
}
私有void ImageDrop2(对象发送方,DragEventArgs e)
{
MessageBox.Show(“放到图2上”);
e、 已处理=正确;
}


看起来问题在于图像控制源尚未设置。

看起来问题在于图像控制源尚未设置。

也许您应该创建一个接收ICommand的AttachedProperty,然后(在视图模型中)在此命令内放置代码;在attached属性内部订阅OnDrag事件并执行ICommand,然后在视图(图像)中将attached属性绑定到命令。

也许您应该创建一个接收ICommand的AttachedProperty,然后(在视图模型中)在此命令内部放置代码;在附加属性内部,订阅OnDrag事件并执行ICommand,然后在视图(图像)中将附加属性绑定到命令。

是否在图像元素上将AllowDrop设置为true?我已在继承权中的每个元素上将AllowDrop设置为true,只是想让它工作。@RonnieOverby您不能将两个
Border
元素放入
DataTemplate
(属性“VisualTree”只能设置一次)。检查你的XAML,我没有。结构是错误的。更新。我已经用实际的xaml、c#和github repo更新了这个问题,以演示这个问题。你在Image元素上将AllowDrop设置为true了吗?我在继承权中的每个元素上都设置了AllowDrop=true,只是想让它起作用。@RonnieOverby你不能在
数据模板中放置两个
Border
元素(属性“VisualTree”只能设置一次).检查你的XAML。我没有。结构是错误的。更新。我已经用实际的XAML和c#和github repo更新了问题,以演示问题。我为什么要这样做?对我来说,听起来像是过度工程,它对解决我遇到的问题没有任何作用。很抱歉延迟。我告诉你,因为我以前使用过它。我可以如果你还想这样做,我会提供代码。我不是真的关心这个项目的MVVM原则,我解决了我的问题。看看我的答案。我为什么要这样做?对我来说,听起来像是过度工程,它对解决我遇到的问题没有任何作用。抱歉,耽搁了。我告诉你,因为我以前用过这个。我如果你还想的话,我可以提供代码来做这件事。我并不真正关心这个项目的MVVM原则,我已经解决了我的问题。看看我的答案。