मान लीजिए कि मुझे एक WPF नियंत्रण पर एक अस्पष्टता मुखौटा सेट करने की आवश्यकता है जो सटीक स्थिति में इसके एक हिस्से को हाइलाइट करता है (50x50 वर्ग (50; 50) स्थिति पर मान लें)। ऐसा करने के लिए मैं एक ड्रॉइंग ग्रुप बनाता हूं जिसमें 2 ज्यामिति ड्रॉइंग ऑब्जेक्ट्स हैं: नियंत्रण के पूरे वास्तविक आकार के लिए 1 सेमी-पारदर्शी आयताकार और हाइलाइट किए गए क्षेत्र के लिए 1 अपारदर्शी आयताकार। फिर मैं इस ड्रॉइंग ग्रुप से ड्रॉइंग ब्रश बना देता हूं, इसे स्ट्रैच प्रॉपर्टी को किसी को भी सेट नहीं करता हूं और इस ब्रश को नियंत्रण के ओपेसिटीमास्क के रूप में सेट करता हूं जिसे मास्क किया जाना चाहिए।सटीक अस्पष्टता मास्क
यह सब ठीक काम करता है जबकि कुछ भी नियंत्रण के सीमाओं से बाहर "चिपकने" नहीं होता है। लेकिन अगर नियंत्रण इसकी सीमा के बाहर कुछ खींचता है तो बाहरी बिंदु एक प्रारंभिक बिंदु बन जाता है जहां से अस्पष्टता मुखौटा लागू होता है (यदि ब्रश उस तरफ गठबंधन होता है) और पूरे मास्क उस दूरी से बदल जाता है जिसके परिणामस्वरूप अप्रत्याशित व्यवहार होता है।
मुझे नियंत्रण की सीमाओं से मास्क को लागू करने के लिए मजबूर करने का कोई तरीका नहीं दिख रहा है या कम से कम नियंत्रण की वास्तविक सीमाएं (भागों को चिपकाने सहित) प्राप्त कर सकते हैं ताकि मैं तदनुसार अपना मुखौटा समायोजित कर सकूं।
किसी भी विचार की अत्यधिक सराहना की!
अद्यतन:
<Border Padding="20" Background="DarkGray" Width="240" Height="240">
<Border Background="LightBlue">
<Canvas>
<Rectangle Canvas.Left="50" Canvas.Top="50" Width="50" Height="50"
Stroke="Red" StrokeThickness="2"
Fill="White"
/>
</Canvas>
</Border>
</Border>
यहाँ:
हम ऊपर उल्लेख किया वर्ग के साथ पिछले एक में 2 नेस्टेड बॉर्डर्स और कैनवास है: यहाँ एक सरल परीक्षण मामले XAML और इस मुद्दे का प्रदर्शन स्क्रीनशॉट है यह कैसे दिखता है:
no mask http://devblog.ailon.org/devblog/_stuff/maskissue/square-no-mask.gif
अब हम एक OpacityM जोड़ने दूसरी सीमा के आग्रह करें कि हमारे वर्ग को छोड़कर यह के हर हिस्से अर्द्ध पारदर्शी है:
<Border.OpacityMask>
<DrawingBrush Stretch="None" AlignmentX="Left" AlignmentY="Top">
<DrawingBrush.Drawing>
<DrawingGroup>
<GeometryDrawing Brush="#30000000">
<GeometryDrawing.Geometry>
<RectangleGeometry Rect="0,0,200,200" />
</GeometryDrawing.Geometry>
</GeometryDrawing>
<GeometryDrawing Brush="Black">
<GeometryDrawing.Geometry>
<RectangleGeometry Rect="50,50,50,50" />
</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingGroup>
</DrawingBrush.Drawing>
</DrawingBrush>
</Border.OpacityMask>
सब कुछ उम्मीद के रूप में दिखता है:
masked http://devblog.ailon.org/devblog/_stuff/maskissue/square-mask.gif
और अब हम कैनवास में रेखा जोड़ने कि हमारे सीमा के बाईं तरफ के 10 पिक्सल बाहर चिपक जाता है:
<Line X1="-10" Y1="150" X2="120" Y2="150"
Stroke="Red" StrokeThickness="2"
/>
और मुखौटा बाईं ओर 10 पिक्सल बदलाव:
shifted mask http://devblog.ailon.org/devblog/_stuff/maskissue/square-line-mask.gif
Update2: मैं सीमा के बाहर एक हास्यास्पद बड़े पारदर्शी आयत जोड़ सकते हैं और उसके अनुसार अपना मुखौटा समायोजित लेकिन यह है कि एक बहुत बुरा समाधान नहीं है समाधान के लिए।
अद्यतन 3: नोट: आयत और रेखा के साथ कैनवास कुछ वस्तु के उदाहरण के रूप में है जिसमें इसके बाहर कुछ है। इस नमूने के संदर्भ में इसे किसी प्रकार का ब्लैक बॉक्स माना जाना चाहिए। आप सामान्य समस्या को हल करने के लिए इसकी संपत्तियों को नहीं बदल सकते हैं। यह लाइन को स्थानांतरित करने जैसा ही होगा, इसलिए यह बाहर नहीं निकलता है।
यह अपने कोड को देखने के लिए मददगार होगा इसके लिए। – Charlie
विस्तृत प्रजनन केस जोड़ने के लिए नमूना कोड और स्क्रीनशॉट –
+1 जोड़ा गया। –