2013-01-04 8 views
6

मेरे पास एक बहुत ही प्राथमिक परीक्षण अनुप्रयोग है जिसमें केवल Window और CustomControl शामिल है। खिड़की कस्टम नियंत्रण होता है और निम्न अतिरिक्त विशेषताएँ हैं:एक विंडो को कम करने और पुनर्स्थापित करने से डब्लूपीएफ में पहले से तैयार ग्राफिक्स पर असर पड़ता है?

TextOptions.TextFormattingMode="Display" 
SnapsToDevicePixels="True" 
UseLayoutRounding="True" 
RenderOptions.EdgeMode="Aliased" 

कस्टम नियंत्रण इन 5 लाइनों कोड-पीछे फ़ाइल को जोड़ा गया है:

protected override void OnRender(DrawingContext drawingContext) 
{ 
    var pen = new Pen(Brushes.Black, 1); 
    drawingContext.DrawLine(pen, new Point(0, 0), new Point(ActualWidth, ActualHeight)); 
} 

सब कुछ अच्छा काम करता है। एक ब्लैक 1 पीएक्स लाइन ऊपरी बाएं से नीचे दाएं कोने तक तिरछे ड्रॉ होती है। उत्तम। स्वीकार्य रूप से pixelated, लेकिन वास्तव में मुझे क्या चाहिए। हालांकि, जब मैं खिड़की को कम करता हूं और इसे फिर से बहाल करता हूं तो रेखा "धुंधला" हो जाती है। यह विंडो को बहाल करने के बाद OnRender विधि के बिना फिर से कॉल करने के बिना होता है। तो खिड़की को कम करने के बाद खींचे गए ग्राफिक्स मूल रूप से क्यों बदलते हैं (फोकस खोना समस्या प्रतीत नहीं होता है)? खिड़की का आकार बदलने के बाद सब कुछ सामान्य क्यों है और मैं इस अवांछित व्यवहार का ख्याल कैसे रख सकता हूं? WindowState परिवर्तनों को हर बार एक पूर्ण आकार/अमान्य करने के लिए मजबूर करना थोड़ा अधिक लगता है, नहीं?

अद्यतन 1:

@Backlash के रूप में मैं एक कैनवास

<Canvas Name="CanvasControl" SizeChanged="FrameworkElement_OnSizeChanged"> 
    <wpfTest:CustomControl x:Name="ChildControl" /> 
</Canvas> 

अंदर कस्टम नियंत्रण डाल सुझाव दिया है और एक के अंदर तत्वों के बाद से SizeChanged घटना इस

private void FrameworkElement_OnSizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    ChildControl.Width = CanvasControl.ActualWidth; 
    ChildControl.Height = CanvasControl.ActualHeight; 
} 

का संचालन कैनवास स्वचालित रूप से लेआउट नहीं होते हैं। हालांकि, परिणाम नहीं बदला।

अद्यतन 2:

एक विचार यह है कि पार कर मेरे मन खिड़की राज्य में परिवर्तन सुन रहा था और एक आकार बदलने के लिए मजबूर - और इसलिए एक पूर्ण redraw - खिड़की के और थोड़ा करके अपने सभी नियंत्रण में परिवर्तन Width या विंडो के Height संपत्ति:

protected override void OnStateChanged(EventArgs e) 
{ 
     if (WindowState != WindowState.Minimized) 
     {    
      Width += 1; 
     } 
} 

यह कुछ परिस्थितियों में काम करता है (हालांकि जब नहीं Window उदाहरण के लिए बड़ा किया गया है), लेकिन आम तौर पर यह बोलने के कारणों की एक संख्या के लिए एक तो एकदम बुरा दृष्टिकोण है। मैंने यह समझने की कोशिश की कि आकार बदलने पर (सही) रेड्रॉ का कारण क्या होता है और इसमें CoreFlags.AreTransformsClean के साथ कुछ करना पड़ सकता है, लेकिन चूंकि सबकुछ या तो आंतरिक या निजी घोषित किया गया है, इसलिए मैंने उन झंडे और किसी भी संबंधित विधियों का उपयोग करने पर छोड़ दिया।

अद्यतन 3:

यह देखते हुए कि WPF असहाय होकर सीधे स्क्रीन पर सीधी रेखाएं ड्राइंग के साथ बोझ किया जा रहा है, मैं पहली बार एक में स्मृति बिटमैप में ड्राइंग और स्क्रीन पर बिटमैप पेंट से कोशिश की। और यह काम करता है। यहां विधि है:

protected override void OnRender(DrawingContext drawingContext) 
{ 
    var rtb = new RenderTargetBitmap((int)ActualWidth, (int)ActualHeight, 96, 96, PixelFormats.Pbgra32); 
    var line = new Line(); 
    RenderOptions.SetEdgeMode(line, EdgeMode.Aliased); 

    line.Stroke = Brushes.Black; 
    line.StrokeThickness = 1; 
    line.X1 = 0; 
    line.X2 = ActualWidth; 
    line.Y1 = 0; 
    line.Y2 = ActualHeight; 
    line.Arrange(new Rect(new Size((int)ActualWidth, (int)ActualHeight))); 
    rtb.Render(line); 

    drawingContext.DrawImage(rtb, new Rect(0, 0, (int)ActualWidth, (int)ActualHeight)); 
} 

"समाधान" कम से कम कहने के लिए हैकी है। यह वास्तव में बुरा है, लेकिन बाकी की तुलना में मैंने अब तक WPF से देखा है यह एक कानूनी दृष्टिकोण हो सकता है। हालांकि, कुछ और उत्तरों के लिए धागा खुला होगा।

+0

क्या करता है जिज्ञासा से बाहर करने की कोशिश क्या आप एक कैनवास कंटेनर के अंदर कस्टम नियंत्रण जगह के बजाय सीधे खिड़की पर अगर होता है? – Backlash

+0

मैंने कोशिश की, लेकिन दुर्भाग्य से परिणाम नहीं बदला। कम से कम राज्य से खिड़की को बहाल करने के बाद भी रेखा धुंधली थी। – UnclePaul

+0

शायद पथ वर्ग पर विचार करें? – Aaj

उत्तर

0

आपको बस आकार बदलने की बजाय विंडो को अमान्य करने में सक्षम होना चाहिए। डब्ल्यूपीएफ की तरह लगता है कि आप खिड़की की एक पेंट करने से बचने का प्रयास कर रहे हैं - इससे पहले कि आप इसे कम करने से पहले विंडो पर छवि को बुरी तरह से बचाएं।

शायद, यह कुछ है जो आप बंद कर सकते हैं?

0

किसी भी प्रतिपादन अपने आप को एक अंतिम उपाय होना चाहिए कर -Chert। क्या वह प्रतिपादन XAML में कुछ भी नहीं कर सकता है?

0

मैं इस Microsoft msdn

के अनुसार क्योंकि आप

SnapsToDevicePixels="True" 

पिक्सेल स्नैप करने का उपयोग कर रहे लगता है, दुर्भाग्य से हमेशा बिल्कुल सही नहीं है बस उपकरण पिक्सेल संरेखण की गारंटी नहीं देता कंटेनर वस्तु के आकार का समायोजन । किसी एप्लिकेशन के पूरे लेआउट से छवि के संरेखण पर असर पड़ सकता है। डिस्प्ले डॉट्स प्रति इंच (डीपीआई) छवि संरेखण को भी प्रभावित करता है। उपर्युक्त उदाहरण में, छवि संरेखण केवल तभी काम करेगा जब प्रदर्शन 96 डॉट्स प्रति इंच (डीपीआई) पर सेट हो। किसी अन्य सेटिंग पर, डिस्प्ले सेटिंग्स को समायोजित करने के लिए लेआउट को समायोजित करने की आवश्यकता है। विंडोज प्रेजेंटेशन फाउंडेशन (डब्ल्यूपीएफ) अनुप्रयोगों में जब भी संभव हो तो उच्च आवृत्ति छवियों से बचा जाना चाहिए।

तो, गलत पर कि झंडा बदलने और देखें कि यह

संबंधित मुद्दे