2009-09-05 19 views
23

मेरे पास एक बहुत ही सरल WPF विंडो है - इसमें एकमात्र चीज एक दाएं संरेखित बटन है। जब मैं बाएं सीमा खींचकर खिड़की का आकार बदलता हूं, तो बटन चारों ओर कूदता है - बहुत कुछ। इसे स्वयं आज़माएं, बाएं सीमा को पीछे और पीछे खींचें।डब्ल्यूपीएफ फॉर्म का आकार बदलने के लिए कैसे करें - नियंत्रण पीछे और काले रंग की पृष्ठभूमि?

इसके अतिरिक्त, आकार के दौरान अस्थायी रूप से एक काला पृष्ठभूमि का खुलासा हो जाता है।

this प्रश्न में, मैंने विंडोज फॉर्म के बारे में एक समान सवाल पूछा। एकमात्र उत्तर मैंने सुझाव दिया कि यह डब्ल्यूपीएफ में तय किया गया है, हालांकि, आश्चर्यजनक रूप से, न केवल यह तय नहीं है, बल्कि डब्ल्यूपीएफ एक दूसरी दृश्य बग - अस्थायी काला पृष्ठभूमि भी जोड़ता है।

यहां नियंत्रण नियंत्रण अंतराल जैसा दिखता है; यह तब होता है जब मैं अपने शीर्ष सीमा से विंडो का आकार बदलने (एक कैमरे से रिकॉर्ड किए क्योंकि स्क्रीन-कैप बनाकर यह कम स्पष्ट कर दिया सब कुछ धीमी गति से):

                                                  enter image description here

काला सीमा का उदाहरण: यह खिड़की का आकार बदलने के दौरान कब्जा कर लिया गया था; यह एक विभाजन के लिए केवल इस तरह है दूसरा लेकिन यह बहुत ध्यान देने योग्य है:

                                      enter image description here

मैं कुछ गलत कर रहा हूं? आकार के दौरान एक ही स्थान पर मेरे नियंत्रण कैसे नजर रख सकते हैं? मैं काला सीमा से कैसे बच सकता हूं?

नोट: बटन सही जगह अंततः में समाप्त होता है - यह केवल आसपास संक्षिप्त कूदता आकार बदलने के दौरान।

+0

मैंने अभी विचार को प्रदर्शित करने के लिए स्क्रीनशॉट की एक सूची बनाई है। –

+5

यह मुझे चौंकाने वाला रखता है। माइक्रोसॉफ्ट सुंदर उपयोगकर्ता इंटरफेस डिजाइन करने के लिए एक अद्भुत तकनीक बनाता है और इस भयानक दृश्य बग पेश किया। –

उत्तर

10

यह विस्सर सॉफ्टवेयर लिमिटेड के दूसरे समाधान के आधार पर पूर्ण कार्य कोड है।

public partial class MainView : Window 
{ 
    public MainView() 
    { 
     InitializeComponent(); 

     //ensure win32 handle is created 
     var handle = new WindowInteropHelper(this).EnsureHandle(); 

     //set window background 
     var result = SetClassLong(handle, GCL_HBRBACKGROUND, GetSysColorBrush(COLOR_WINDOW)); 
    } 

    public static IntPtr SetClassLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong) 
    { 
     //check for x64 
     if (IntPtr.Size > 4) 
      return SetClassLongPtr64(hWnd, nIndex, dwNewLong); 
     else 
      return new IntPtr(SetClassLongPtr32(hWnd, nIndex, unchecked((uint)dwNewLong.ToInt32()))); 
    } 

    private const int GCL_HBRBACKGROUND = -10; 
    private const int COLOR_WINDOW = 5; 

    [DllImport("user32.dll", EntryPoint = "SetClassLong")] 
    public static extern uint SetClassLongPtr32(IntPtr hWnd, int nIndex, uint dwNewLong); 

    [DllImport("user32.dll", EntryPoint = "SetClassLongPtr")] 
    public static extern IntPtr SetClassLongPtr64(IntPtr hWnd, int nIndex, IntPtr dwNewLong); 

    [DllImport("user32.dll")] 
    static extern IntPtr GetSysColorBrush(int nIndex); 
} 
+0

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

1

मेरा मानना ​​है कि अस्थायी काला पृष्ठभूमि एक डब्ल्यूपीएफ मुद्दा है जो इस तथ्य से संबंधित है कि डब्ल्यूपीएफ डायरेक्टएक्स को रेंडरिंग तंत्र के रूप में उपयोग करता है, और जब आप खिड़कियों का आकार बदलते हैं तो इसे विंडोिंग सिस्टम के साथ ड्राइंग सिंक्रनाइज़ करना होता है। यह भी समझा सकता है कि खिड़की सीमा खींचते समय विंडो के संबंध में बटन गुमराह क्यों किया जाता है। खिड़की के गैर-क्लाइंट क्षेत्र को चित्रित करना खिड़की के अंदर क्या है, ड्राइंग करने से बहुत धीमा है, और यदि आप धीमे कंप्यूटर पर माउस को तेजी से ले जाते हैं तो सीमा के बीच की विसंगतियां खिड़की के आंतरिक अंत में अधिक ध्यान देने योग्य होंगी।

माना जाता है कि यह केवल एरो सक्षम के साथ Vista पर होता है, और इसे Vista SP1 में ठीक किया जाना चाहिए था। हालांकि, मैंने अभी एसपी 2 पर परीक्षण किया है, और मैंने अभी भी थोड़ा सा काला पृष्ठभूमि देखा है, लेकिन केवल जब एरो सक्षम था। मेरा ग्राफिक्स कार्ड बहुत तेज है इसलिए यह शायद ही ध्यान देने योग्य था।

यदि मेरा विश्लेषण सही है तो आप अपनी समस्या को ठीक कर सकते हैं, एक तेज़ ग्राफिक्स कार्ड प्राप्त करना या एरो बंद करना है।

+0

धन्यवाद, आपका सुझाव यह कम ध्यान देने योग्य बना सकता है लेकिन इसे पूरी तरह खत्म नहीं कर सकता है। समस्या यह नहीं है कि यह कितनी देर तक दिखाई दे रहा है, लेकिन यह बिल्कुल दिखाई दे रहा है ... वैसे, समस्या Win7 RTM में भी मौजूद है। –

+5

मैं इसे WPF4.0 और Win7 64bit SP1 – sprocket12

2

यह WPF के वर्तमान संस्करणों में संभव नहीं प्रतीत होता है।

4

दो समाधान, यहां बताए गए हैं: http://wieser-software.blogspot.co.uk/2012/06/wpf-window-rendering-woes.html

  1. हुक WndProc और WM_ERASEBKGND संभालने के लिए और पृष्ठभूमि, या किसी अन्य रंग आपके आवेदन विषय सूट करने के लिए पर प्रणाली WINDOW_COLOR आकर्षित।
  2. कॉल SetClassLong विंडो वर्ग पृष्ठभूमि ब्रश

    SetClassLong स्थापित करने के लिए (संभाल, GCL_HBRBACKGROUND, GetSysColorBrush (COLOR_WINDOW));

+0

के साथ देखता हूं यह रंग बदलता है, वास्तव में, इसलिए +1, लेकिन मैं रंग को पहले स्थान पर दिखाने की कोशिश नहीं कर रहा हूं। मेरा मतलब है कि जीडीआई दिनों की तरह है जहां सब कुछ पीछे से पीछे हट गया। क्या यह डबल-बफर नहीं हो सकता है? ... :) –

+0

आप क्लाइंट क्षेत्र में ग्लास को एक अलग प्रभाव के लिए बढ़ा सकते हैं, लेकिन यह केवल तभी काम करता है जब एयरो चालू हो। –

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

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