2010-07-23 10 views
8

मैं एक WPF विंडो बनाने की कोशिश कर रहा हूं जो पहले से ही अधिकतम आकार में खुलता है, बिना किसी आकार/चाल (systemmenu में, न ही सीमा में)। इसे हर समय अधिकतम किया जाना चाहिए, सिवाय इसके कि जब उपयोगकर्ता इसे कम करता है।कैसे करें? डब्ल्यूपीएफ विंडो - अधिकतम, कोई आकार बदलें/

मैंने विंडोस्टेट = "अधिकतम" और ResizeMode = "CanMinimize" डालने का प्रयास किया, लेकिन जब खिड़की खुलती है, तो यह टास्क बार को कवर करती है (मुझे यह नहीं चाहिए)।

मेरे पास WndProc के लिए एक हुक है जो SC_MOVE और SC_SIZE को रद्द करता है। मैं इस नियंत्रण को WndProc में स्थितियों के साथ भी बना सकता हूं जैसे कि "अगर आदेश बहाल किया गया है और इसे छोटा किया गया है, पुनर्स्थापित करें, अन्यथा, ब्लॉक करें" और इसी तरह।

लेकिन मेरा मुद्दा यह है कि अगर हमारे पास इसे बनाने का दूसरा तरीका है। पढ़ने वाले लोगों के लिए धन्यवाद =)

+0

यह एक आम समस्या सभी Windows एप्लिकेशन फ़्रेमवर्क में पाया। ऐप फ्रेमवर्क बहुत अच्छे हैं, वे हमें एप्लिकेशन को बहुत तेज़ी से लिखने की अनुमति देते हैं। समस्या यह है कि वे हर संभावित परिदृश्य को कवर नहीं कर सकते हैं और क्योंकि उनका उद्देश्य अंतर्निहित प्रणाली के किरदार, किरकिरा विवरण को छिपाना है, जब हमें लगता है कि हमें गैर-मानक व्यवहार करने की आवश्यकता है तो हमें "बदसूरत" कोड खोदना और लिखना होगा। – Tergiver

+0

आप एक खिड़की चाहते हैं जिसे केवल सामान्य या न्यूनतम नहीं किया जा सकता है जिसका आकार बदलकर/स्थानांतरित किया जा सकता है? लेकिन अभी तक पूर्ण स्क्रीन नहीं है? –

+0

@ जॉन गार्डनर, यह वही है जो मैं चाहता हूं। –

उत्तर

1

जैसा कि टर्गीवर ने बताया, यह पूरी तरह से WPF तरीके से संभव नहीं है। आपको पी/आमंत्रण का उपयोग करना होगा। जब खिड़की खुलती है तो विंडो टास्कबार को क्यों कवर करती है, मुझे लगता है कि आप SC_MOVE और SC_SIZE को रद्द करके कुछ आवश्यक कॉल को गड़बड़ कर रहे हैं। खिड़की लोड होने के बाद शायद आपको उन कॉल को रद्द करना चाहिए।

+0

PInvoke ????? विंडो कन्स्ट्रक्टर में इसके बारे में कैसे? // टास्कबार को ओवरलैप करने वाली विंडो को रोकें यह। मैक्सहेइट = सिस्टम पैरामीटर। मैक्सिमाइज्ड प्रीमियरस्क्रीन हाइट; यह। मैक्सविड्थ = सिस्टम पैरामीटर। मैक्सिमाइज्ड प्राइमरीस्क्रीनविड्थ; – Califf

2
public Window1() 
    { 
     InitializeComponent(); 

      this.SourceInitialized += Window1_SourceInitialized; 
    } 

    private void Window1_SourceInitialized(object sender, EventArgs e) 
    { 
     WindowInteropHelper helper = new WindowInteropHelper(this); 
     HwndSource source = HwndSource.FromHwnd(helper.Handle); 
     source.AddHook(WndProc); 
    } 

    const int WM_SYSCOMMAND = 0x0112; 
    const int SC_MOVE = 0xF010; 

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
    { 

     switch (msg) 
     { 
      case WM_SYSCOMMAND: 
       int command = wParam.ToInt32() & 0xfff0; 
       if (command == SC_MOVE) 
       { 
        handled = true; 
       } 
       break; 
      default: 
       break; 
     } 
     return IntPtr.Zero; 
    } 
+2

यह कोड विंडो को केवल स्थानांतरित या अधिकतम करने से रोक देगा। यदि इसके बजाय आप SC_SIZE का उपयोग करते हैं तो यह विंडो को अधिकतम और न्यूनतम करने की अनुमति देता है, लेकिन इसका आकार बदल नहीं जाता है। कॉन्स int SC_SIZE = 0xF000; मेरी विंडो xaml में मैं WindowState = "Minimized" का उपयोग करता हूं और ResizeMode = "CanResize" –

12

यह अपने विंडो के XAML में WindowState="Maximized" ResizeMode="NoResize" लिखने के लिए आवश्यक है:

<Window x:Class="Miscellaneous.EditForm" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Edit Form" WindowState="Maximized" ResizeMode="NoResize"></Window> 
+0

विंडोस्टेट = "अधिकतम" सेट करना स्प्लैशस्क्रीन सुविधा के साथ असंगत है (आपकी मुख्य विंडो स्प्लैश स्क्रीन छुपाएगी)। और यदि आप अधिकतम प्रारंभ नहीं करते हैं, तो ResizeMode = "NoResize" विंडो को अधिकतम करने से रोक देगा। –

0
WindowState="Maximized" 
ResizeMode="NoResize" 
WindowStyle="None" 

WindowStyle = "कोई नहीं" तुम क्या चाहते हो, लेकिन ... आप विंडो शीर्षक खो देते हैं, करीब बटन और अन्य समस्याएं हैं।

जाएँ WindowStyle="None" some problems

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