.net 如何将文件放到列表框内的WPF图像控件上
我有一个带有以下xaml的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
<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原则,我已经解决了我的问题。看看我的答案。