2011-09-19 25 views
6

Çok basit bir program yapmaya çalışıyorum ya da bir dosyayı masaüstünden/explorer'dan bir wpf treeview'e sürükleyip bırakmayı düşünüyorum.WPF dosyaları Windows Gezgini'nden TreeView'e sürükleyip bırakın

Bu örnekte yer alan ağaç görünümü, sahip olduğum sürükle ve bırak problemini izole edebilmem için çok basit. AllowDrop'u her yere eşit olarak ayarladım, yine de Drop veya DragOver olaylarını tetikleyemiyorum. Treeview kontrolüne odaklandım çünkü dosyaları hiyerarşik bir yapıya sahip farklı düğümlere sürükleyebilmek istiyorum. Şu anda sadece bir dosyayı treeview üzerine sürüklediğimde DragOver veya Drop olaylarını tetikleyebildiğim için yerleşecektim.

Ben bu gibi örnekler bakarak Başladıktan adres: Drag & Drop in Treeview

Sorum olduğu benzer buna: Drag drop files from explorer onto Telerik WPF treeview. Ancak wpf treeview kullanıyorum, telerik olanı değil. İşte

Ben kodudur bugüne kadar

XAML:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace WpfDragAndDropTest 
{ 
/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     TreeView1.ItemsSource = new[] 
     { 
      new TestClass { Title = "Google", Url = "http://www.google.com" }, 
      new TestClass { Title = "Microsoft", Url = "http://www.microsoft.com" }, 
      new TestClass{ Title="Netflix", Url="http://www.netflix.com" } 
     }; 
    } 

    private void TreeView1_Drop(object sender, DragEventArgs e) 
    { 

    } 

    private void TreeView1_DragOver(object sender, DragEventArgs e) 
    { 

    } 

    private void TreeView1_MouseMove(object sender, MouseEventArgs e) 
    { 

    } 
} 


public class TestClass 
{ 
    public string Title { get; set; } 
    public string Url { get; set; } 
} 
} 

Düzenleme Ben olaylar olarak sorunumu dile metni kalın: Kod

<Window x:Class="WpfDragAndDropTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfDragAndDropTest" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <TreeView Name="TreeView1"> 
      <TreeView.ItemContainerStyle> 
       <Style TargetType="{x:Type TreeViewItem}" > 
        <Setter Property="TreeViewItem.AllowDrop" Value="True"/> 
        <EventSetter Event="TreeViewItem.DragOver" Handler="TreeView1_DragOver" /> 
        <EventSetter Event="TreeViewItem.Drop" Handler="TreeView1_Drop" /> 
        <EventSetter Event="TreeViewItem.MouseMove" Handler="TreeView1_MouseMove" /> 
       </Style> 
      </TreeView.ItemContainerStyle> 

      <TreeView.Resources> 
       <DataTemplate DataType="{x:Type local:TestClass}"> 
        <StackPanel Orientation="Vertical" > 
         <TextBlock Text="{Binding Path=Title}" /> 
         <TextBlock Text="{Binding Path=Url}" /> 
        </StackPanel> 
       </DataTemplate> 
      </TreeView.Resources> 

     </TreeView> 
    </Grid> 
    </Window> 

ateş etmeyin.

xaml öğesini buna aldım ve ağaç görünümü üzerinde bir dosya sürüklerken ve hareket eden tek olay MouseMove olduğunda, üzerinde siyah bir daire çiziyorum. Bu eylemleri gerçekleştirmek için fareyi kullanırsam, Sürükle ve Bırak ateşlemez.

<TreeView Name="TreeView1" AllowDrop="True" DragOver="TreeView1_DragOver" Drop="TreeView1_Drop" MouseMove="TreeView1_MouseMove"> 


     <TreeView.Resources> 
      <DataTemplate DataType="{x:Type local:TestClass}"> 
       <StackPanel Orientation="Vertical" > 
        <TextBlock Text="{Binding Path=Title}" /> 
        <TextBlock Text="{Binding Path=Url}" /> 
       </StackPanel> 
      </DataTemplate> 
     </TreeView.Resources> 

    </TreeView> 

Düzenleme Ben boş ağaç çalıştı ve bunun üzerinden bir dosya sürüklemek başardı ve imleç içinden çizgi ile siyah daire değildi. bu DataTemplate buna ilave edildiğinde siyah daire gösteren başladığında

<TreeView Height="312" Background="#FFCFDBF9" AllowDrop="True"/> 

Bununla birlikte, bu. Bu bir çeşit veri bağlama sorunu mu olmalı?

Düzenle Şimdi bir yere ulaşmaya başlıyorum.

Bu benim xaml değiştirdi ve olaylar ateşleme başlar:

<TreeView Name="TreeView1" Background="#FFC9D7FF"> 


    <TreeView.Resources> 
     <DataTemplate DataType="{x:Type local:TestClass}"> 
      <StackPanel Orientation="Vertical" AllowDrop="True" DragOver="TreeView1_DragOver" Drop="TreeView1_Drop" MouseMove="TreeView1_MouseMove" > 
       <TextBlock Text="{Binding Path=Title}" /> 
       <TextBlock Text="{Binding Path=Url}" /> 
      </StackPanel> 
     </DataTemplate> 
    </TreeView.Resources> 

</TreeView> 

düzenlemek Ben sadece sürükle ve ifade harmanından projeyi çalıştırırsanız stackpanel düşmesi olabileceğini keşfettiler. Eğer onu görsel stüdyosundan çalıştırırsam, içinden bir çizgi olan siyah daireyi gösterir. Bu hiç mantıklı değil.Visual Studio 2010 WPF Project ran in debug or relase will not allow drag and drop to any control

Bu, tüm yönetici olarak görsel stüdyo çalışan kaynaklanır: Bu ayrı sorun için burada başka bir soru başlamıştır. Görünüşe göre aynı şey notepad.exe için doğrudur, yönetici olarak bir şey çalıştırırsanız sürükleyip bırakamazsınız. Şimdi IIS hata ayıklama için yönetici olarak çalışmam gerekiyor ve sürükleyip bırakarak normal modda nasıl çalışacağımı anlamaya ihtiyacım var ...

+0

nasıl Hiç bu çalışma almak için hayal edersiniz? TreeView1_Drop içinde bir sorun mu var? öyleyse, neye ihtiyacınız olduğunu açıklayın ve ne denediğinizi açıklayın, DragEventArgs e nesnesinin özelliklerini kontrol etmeye başlayın ve içerdiği hata ayıklama zamanını ve ihtiyacınız olanı almak için bunları nasıl kullanabileceğinizi görün. Boş bıraktığınız diğer etkinlikler için de aynı ... –

+0

Sorunun, ateş etmeyen olaylar olduğunu söyleyen bölümünün altını çizdim. Teşekkürler. – 249076

+0

Bırakılan öğenin kabul öğesi değişkenini ayarlıyor ve doğruya doğru sürükleniyor mu? –

cevap

1

Sorunun, öğeyi TreeViewItems'in kendileri üzerinde sürüklemediğini düşünüyorum. Bu, olaylarınızın yalnızca TreeViewItems için kaydedildiği için gereklidir. Ebeveyn düzeyinizi ağacınıza sürükleyip bırakmak istiyorsanız, ilgili etkinlikleri ağacınıza eklemeniz gerekir.

Bu çözümle alacağınız sorun, TreeView olaylarının önce işleyeceğidir. Şimdi, hangi düğümün düzgün ekleyeceğinizi bilmek zorundasınız. Hangi düğümün bittiğini anlamak için çözümler var. Bununla birlikte, ağacınıza daima orada olan bir üst düzey öğe eklemenizi öneririm. Ardından, olayları TreeViewItems'e olduğu gibi bağlayın. Bu şekilde, TreeView olaylarını işlemek zorunda kalmadan üst seviyeye ekleyebilirsiniz, çünkü bu en üst seviyeye sürükleyebilirsiniz.

Bunu test etmek için kullandığım şey, doğrudan TreeViewItems'in üzerine sürüklersek kesme noktalarını görüyorum. Bazı ad alanlarını tanıyamazsınız, ancak bu, projeme referans olması nedeniyle.

XAML: arkasında

<TreeView x:Name="treeView"> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}" > 
      <Setter Property="TreeViewItem.AllowDrop" Value="True"/> 
      <EventSetter Event="TreeViewItem.DragOver" Handler="treeView_DragOver" /> 
      <EventSetter Event="TreeViewItem.Drop" Handler="treeView_Drop" /> 
      <EventSetter Event="TreeViewItem.MouseMove" Handler="treeView_MouseMove" /> 
     </Style> 
    </TreeView.ItemContainerStyle> 

    <TreeView.Resources> 
     <DataTemplate DataType="{x:Type FileExplorerDragDrop:TestClass}"> 
      <StackPanel Orientation="Vertical" > 
       <TextBlock Text="{Binding Path=Title}" /> 
       <TextBlock Text="{Binding Path=Url}" /> 
      </StackPanel> 
     </DataTemplate> 
    </TreeView.Resources> 
    </TreeView> 

Kodu:

public MainWindow() 
    { 
    InitializeComponent(); 

    treeView.ItemsSource = new[] 
    { 
     new TestClass { Title = "Google", Url = "http://www.google.com" }, 
     new TestClass { Title = "Microsoft", Url = "http://www.microsoft.com" }, 
     new TestClass{ Title="Netflix", Url="http://www.netflix.com" } 
    }; 
    } 

    private void treeViewItem_DragOver(object sender, DragEventArgs e) 
    { 

    } 

    private void treeViewItem_Drop(object sender, DragEventArgs e) 
    { 

    } 

    private void treeViewItem_MouseMove(object sender, MouseEventArgs e) 
    { 

    } 
+0

Sadece olayların ağaç görünümünde yanmasına odaklanmak için soruyu düzenledim. Olayları ağaç görüntüsüne yeniden düzenledim ve ağaç görüntülemelerindeki olay düzenleyicilerinden kurtuldum. Eksik olduğum çok basit bir şey olmalı. Dosyayı ağaç görünümü üzerinde sürüklediğimde, tüm alabildiğim bir çizgi siyah bir dairedir. Dosyayı bırakmak, Drop Event'in patlamasına neden olmaz. O olayı ateş edebilecek olsaydım test yapmam ya da neyin bittiğini anlamak için bir şey yapabilirdim. – 249076

+0

İfade karışımında çalışıyorum, ancak en son xaml'i görsel stüdyosunda kullandığımda, ağaç görünümündeki yığın paneline sürükleyip bırakmama izin vermeyeceğim. Gerçekten umut vericiydi çünkü eğer yığın projeyi sürükleyip bırakabilirsem, bu projeyi donatacaktı. – 249076

+0

Cevabınızı sizinki gibi işaretledim çünkü beni düşünmeme neden oldu, bilgisayarımda bir sorun var. Bu, yönetici olarak çalıştırıyorsanız sürükleyip bırakamayacağınızı öğrenmemize neden oldu. – 249076

İlgili konular