2011-01-26 9 views
8

मेरे पास WPF में Image नियंत्रण है जिसमें बहुत से पारदर्शी पिक्सल वाली छवि है। Image नियंत्रण के पूर्ण आयताकार क्षेत्र में क्लिक करते समय MouseDown घटना Image आग पर आग लगती है। मुझे यह पता लगाने का कोई तरीका चाहिए कि छवि के नॉनट्रांस्पेरेंट हिस्से पर माउस क्लिक किया गया है या नहीं।डब्ल्यूपीएफ: छवि का पता लगाएं केवल गैर-पारदर्शी भाग पर क्लिक करें

ऐसा करने का सबसे अच्छा तरीका क्या होगा?

उत्तर

13

एक OpaqueClickableImage कि केवल मारा-परीक्षण करने के लिए छवि के लिए पर्याप्त रूप से अपारदर्शी क्षेत्रों में प्रतिक्रिया करता है बनाने के लिए this answer में तकनीक आप Image से निकाले जाते हैं कर सकते हैं का उपयोग करना: इस वर्ग को जोड़ने के बाद

public class OpaqueClickableImage : Image 
{ 
    protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters) 
    { 
     var source = (BitmapSource)Source; 

     // Get the pixel of the source that was hit 
     var x = (int)(hitTestParameters.HitPoint.X/ActualWidth * source.PixelWidth); 
     var y = (int)(hitTestParameters.HitPoint.Y/ActualHeight * source.PixelHeight); 

     // Copy the single pixel into a new byte array representing RGBA 
     var pixel = new byte[4]; 
     source.CopyPixels(new Int32Rect(x, y, 1, 1), pixel, 4, 0); 

     // Check the alpha (transparency) of the pixel 
     // - threshold can be adjusted from 0 to 255 
     if (pixel[3] < 10) 
      return null; 

     return new PointHitTestResult(this, hitTestParameters.HitPoint); 
    } 
} 

, बस इसका इस्तेमाल

<utils:OpaqueClickableImage Name="image" Source="http://entropymine.com/jason/testbed/pngtrans/rgb8_t_bk.png" Stretch="None"/> 
+1

धन्यवाद: एक नियमित रूप से छवि की तरह! यह पूरी तरह से काम करता है। मुझे उस दूसरी पोस्ट को याद किया होगा। – Bradley

+0

Awsome! आपका बहुत बहुत धन्यवाद! :) – CainKellye

+0

मैंने वास्तव में यह असफल पाया है क्योंकि 'x' या' y' 'स्रोत' के 'पिक्सेलविड्थ' या 'पिक्सेलहेइट' के बाहर होगा। या तो गणना को गोल कर सकते हैं, या कह सकते हैं, यदि 'x> = पिक्सेल विड्थ: x = पिक्सेल विड्थ' –

3
public class OpaqueClickableImage : Image 
{ 
    protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters) 
    { 
     var source = (BitmapSource)Source; 
     var x = (int)(hitTestParameters.HitPoint.X/ActualWidth * source.PixelWidth); 
     var y = (int)(hitTestParameters.HitPoint.Y/ActualHeight * source.PixelHeight); 
     if (x == source.PixelWidth) 
      x--; 
     if (y == source.PixelHeight) 
      y--; 
     var pixels = new byte[4]; 
     source.CopyPixels(new Int32Rect(x, y, 1, 1), pixels, 4, 0); 
     if (pixels[3] < 1) return null; 
     return new PointHitTestResult(this, hitTestParameters.HitPoint); 
    } 
} 
संबंधित मुद्दे