मेरे पास एक बहुत ही प्राथमिक परीक्षण अनुप्रयोग है जिसमें केवल 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 से देखा है यह एक कानूनी दृष्टिकोण हो सकता है। हालांकि, कुछ और उत्तरों के लिए धागा खुला होगा।
क्या करता है जिज्ञासा से बाहर करने की कोशिश क्या आप एक कैनवास कंटेनर के अंदर कस्टम नियंत्रण जगह के बजाय सीधे खिड़की पर अगर होता है? – Backlash
मैंने कोशिश की, लेकिन दुर्भाग्य से परिणाम नहीं बदला। कम से कम राज्य से खिड़की को बहाल करने के बाद भी रेखा धुंधली थी। – UnclePaul
शायद पथ वर्ग पर विचार करें? – Aaj