ফাইলগুলি ডাব্লুপিএফ-এ টেনে আনুন


106

আমার ডাব্লুপিএফ অ্যাপ্লিকেশনটিতে একটি চিত্র ফাইল ফেলে দেওয়া দরকার। আমি ফাইলগুলিতে নামানোর সময় আমার একটি ইভেন্ট ফায়ারিং রয়েছে, তবে কীভাবে করব তা আমি জানি না। আমি কীভাবে চিত্রটি পেতে পারি? বিষয়টি কি senderচিত্র বা নিয়ন্ত্রণ?

private void ImagePanel_Drop(object sender, DragEventArgs e)
{
    //what next, dont know how to get the image object, can I get the file path here?
}

উত্তর:


211

এটি মূলত আপনি যা করতে চান তা।

private void ImagePanel_Drop(object sender, DragEventArgs e)
{

  if (e.Data.GetDataPresent(DataFormats.FileDrop))
  {
    // Note that you can have more than one file.
    string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);

    // Assuming you have one file that you care about, pass it off to whatever
    // handling code you have defined.
    HandleFileOpen(files[0]);
  }
}

এছাড়াও, এক্সএএমএল-তে ইভেন্টটি হুক আপ করতে ভুলে যাবেন না, পাশাপাশি AllowDropবৈশিষ্ট্যটিও সেট করে নিন ।

<StackPanel Name="ImagePanel" Drop="ImagePanel_Drop" AllowDrop="true">
    ...
</StackPanel>

দুর্দান্ত কাজ একটি কবজ কাজ করে, "হ্যান্ডেলফিলঅপেন (ফাইলগুলি [0]) অদলবদল করেছে;" "ফোরচ (ফাইলগুলিতে স্ট্রিং ফাইল) {ওপেনফাইলে (ফাইল);}" - ধন্যবাদ :)
ইমন ম্যাকইভয়

@ মাট্টিও কেয়ার বিস্তৃত করার জন্য?
এআর

1
দুঃখিত :) আমি বোঝাতে চাইছি ড্র্যাগ এবং ড্রপ কাজ করে না। AllowDropসত্য হিসাবে সেট করা থাকলেও Dropইভেন্ট হ্যান্ডলারটি কখনই ডাকা হয় না। আমি যখন উইন্ডোতে কোনও ফাইল টেনে
আনি

4
আমি একটি Gridমূল উপাদান হিসাবে ব্যবহার করেছি , Borderঅভ্যন্তরের সাথে কোনও Backgroundকিছুতে সেট করা সম্পত্তি (সাদা ভাল, তবে স্বচ্ছ নয়)। ইনসাইড Borderআমি প্রকৃত বিষয়বস্তু দিলেন।
এমকন্ট

1
গ্রিডে নেমে যাওয়ার চেষ্টা করার সময় পটভূমিটি স্বচ্ছ হিসাবে সেট করা আমার পক্ষে ভাল কাজ করে। দৃশ্যত আপনার পটভূমি প্রয়োজন যাতে হিট পরীক্ষা হয় happens এই ব্লগ এন্ট্রি ধন্যবাদ: কোড inreview.com/136/enabling-drag-and-DP-over-a-grid-in-wpf
ডাস্টিনা

35

ইমেজ ফাইল মধ্যে অন্তর্ভুক্ত করা হয় eপরামিতি, যা একটি দৃষ্টান্ত হল DragEventArgsবর্গ
( senderপ্যারামিটারে ইভেন্টটি উত্থাপিত বস্তুর একটি উল্লেখ রয়েছে))

বিশেষত, e.Dataসদস্যটি পরীক্ষা করুন ; ডকুমেন্টেশনের ব্যাখ্যা অনুসারে, এটি এমন ডেটা অবজেক্টের একটি রেফারেন্স দেয় ( IDataObject) যা টেনে নেওয়ার ইভেন্ট থেকে ডেটা ধারণ করে।

IDataObjectইন্টারফেস ডেটা বস্তু আপনি পরে থাকেন পুনরুদ্ধারের জন্য পদ্ধতি একটি সংখ্যা প্রদান করে। আপনি যে ডেটা দিয়ে কাজ করছেন তার ফর্ম্যাটটি খুঁজে বের করার জন্য আপনি সম্ভবত GetFormatsপদ্ধতিটি কল করে শুরু করতে চাইবেন । (উদাহরণস্বরূপ, এটি কি প্রকৃত চিত্র বা কেবল কোনও চিত্র ফাইলের পথ?)

তারপরে, একবার আপনি ফাইলটির ফর্ম্যাটটি টেনে আনার শনাক্ত করার পরে, GetDataআপনি কোনও নির্দিষ্ট ফর্ম্যাটে ডেটা অবজেক্টটি পুনরুদ্ধার করার জন্য পদ্ধতির নির্দিষ্ট ওভারলোডগুলির একটি কল করবেন ।


12

অতিরিক্তভাবে এআরের উত্তর দেওয়ার জন্য দয়া করে নোট করুন যে আপনি যদি TextBoxড্রপ ব্যবহার করতে চান তবে আপনাকে নিম্নলিখিত জিনিসগুলি জানতে হবে।

TextBoxইতিমধ্যে কিছু ডিফল্ট হ্যান্ডলিং রয়েছে বলে মনে হচ্ছে DragAndDrop। যদি আপনার ডেটা অবজেক্টটি একটি হয় তবে Stringএটি সহজভাবে কাজ করে। অন্যান্য প্রকারগুলি পরিচালনা করা হয় না এবং আপনি নিষিদ্ধ মাউস প্রভাব পান এবং আপনার ড্রপ হ্যান্ডলারটি কখনও কল হয় না।

মনে হচ্ছে তুমি সঙ্গে আপনার নিজের হ্যান্ডলিং সক্ষম করতে পারেন বলে মনে হয় e.Handledকরার সত্য একটি PreviewDragOverইভেন্ট হ্যান্ডলার।

XAML

<TextBox AllowDrop="True"    x:Name="RtbInputFile"      HorizontalAlignment="Stretch"   HorizontalScrollBarVisibility="Visible"  VerticalScrollBarVisibility="Visible" />

সি শার্প

RtbInputFile.Drop += RtbInputFile_Drop;            
RtbInputFile.PreviewDragOver += RtbInputFile_PreviewDragOver;

private void RtbInputFile_PreviewDragOver(object sender, DragEventArgs e)
{
    e.Handled = true;
}

private void RtbInputFile_Drop(object sender, DragEventArgs e)
{
     if (e.Data.GetDataPresent(DataFormats.FileDrop))
     {
                // Note that you can have more than one file.
                string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
                var file = files[0];                
                HandleFile(file);  
     }
}

1
এআর এর উদাহরণটি প্রিভিউড্রাগওভার হ্যান্ডলারটিকে মিস করে, এটি সমস্তকে একত্রিত করা গুরুত্বপূর্ণ is যশ।
গ্রেগ ভোগেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.