2008-12-04 13 views
66

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

मुझे पता है कि समाधान पिनवोक का उपयोग करने का मतलब होगा लेकिन मुझे यकीन नहीं है कि कॉल करना और कैसे। Pinvoke.net की एक खोज ने मुझे जो कुछ भी जरूरी था, उस पर कोई चीज नहीं उठी, मुख्य रूप से मुझे यकीन है कि विंडोज़ फॉर्म CanMinimize और CanMaximize अपनी खिड़कियों पर गुण प्रदान करता है।

क्या कोई मुझे यह करने के तरीके पर कोड या सी (पसंदीदा #) प्रदान कर सकता है?

उत्तर

93

मैं कुछ कोड मैं MSDN मंचों पर पाया चोरी और विंडो वर्ग पर एक विस्तार विधि बनाया है, इस तरह की है:

internal static class WindowExtensions 
{ 
    // from winuser.h 
    private const int GWL_STYLE  = -16, 
         WS_MAXIMIZEBOX = 0x10000, 
         WS_MINIMIZEBOX = 0x20000; 

    [DllImport("user32.dll")] 
    extern private static int GetWindowLong(IntPtr hwnd, int index); 

    [DllImport("user32.dll")] 
    extern private static int SetWindowLong(IntPtr hwnd, int index, int value); 

    internal static void HideMinimizeAndMaximizeButtons(this Window window) 
    { 
     IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(window).Handle; 
     var currentStyle = GetWindowLong(hwnd, GWL_STYLE); 

     SetWindowLong(hwnd, GWL_STYLE, (currentStyle & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX)); 
    } 
} 

याद करने के लिए केवल एक अन्य बात यह है कि किसी कारण से यह नहीं करता है 'है एक खिड़की के कन्स्ट्रक्टर से काम नहीं करते हैं। मैं इसे कन्स्ट्रक्टर में चकित करके मिला:

this.SourceInitialized += (x, y) => 
{ 
    this.HideMinimizeAndMaximizeButtons(); 
}; 

आशा है कि इससे मदद मिलती है!

+0

वास्तव में ऐसा हुआ! बहुत धन्यवाद! – Nidonocu

+0

शायद हैंडल के निर्माण के बाद ऐसा करने के लिए और अधिक समझदारी होगी, शायद विंडो पर प्रारंभिक घटना के लिए हैंडलर में? –

+0

अच्छा कामकाज माइक। अच्छी तरह से काम। – BrettRobi

17

अगर यह आपके अनुरोध के लिए काम करता है पता नहीं है। नेत्रहीन .. यह

<Window x:Class="DataBinding.MyWindow" ...Title="MyWindow" Height="300" Width="300" 
    WindowStyle="ToolWindow" ResizeMode="CanResizeWithGrip"> 
+1

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

+0

दाएं ... लेकिन फिर फिर से आईएमएचओ बाधा प्रतीत होती है कि उपयोगकर्ता को अधिकतम करने की अनुमति नहीं है लेकिन आकार बदलकर विंडो को मैन्युअल रूप से खींचें। लेकिन यह आपकी खिड़की है .. आपके नियम :) – Gishu

+0

यह उन परिस्थितियों के लिए आसान हो सकता है जहां विंडो का 'मैक्सविड्थ' और/या 'मैक्सहेइट' सेट किया गया है। –

2

आप ResizeMode = विंडो के "NoResize" सेट कर सकते हैं आप

+0

एह लेकिन फिर आप आकार बदल नहीं सकते हैं यह – Karsten

3

यहाँ एक समाधान मैं उपयोग कर रहा हूँ है कम से कम हटाने और बटन को अधिकतम करने के लिए चाहते हैं। ध्यान दें कि अधिकतम बटन अभी भी प्रदर्शित होता है।

मार्कअप:

<Window x:Class="Example" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Example" 
     StateChanged="Window_StateChanged"> 

पीछे कोड:

// Disable maximizing this window 
private void Window_StateChanged(object sender, EventArgs e) 
{ 
    if (this.WindowState == WindowState.Maximized) 
     this.WindowState = WindowState.Normal; 
} 
+1

करने में सक्षम होना चाहिए, उन्होंने बटन को छुपाने के लिए कहा लेकिन कार्यक्षमता को बनाए रखा। – alexandrudicu

+0

जितना कम है, खिड़की झटकेदार है। इतना अच्छा नही है। – Mugen

73

एक तरह से अपने ResizeMode="NoResize" स्थापित करने के लिए है। यह इस तरह व्यवहार करेगा। enter image description here

मुझे आशा है कि इससे मदद मिलती है!

+0

मेरी मदद करता है, धन्यवाद! –

+22

इससे खिड़की का आकार बदलने योग्य नहीं होगा, जो सीधे सवाल के विपरीत है। – Mashmagar

+3

आमतौर पर googlers जो कम से कम अक्षम करने और बटन को अधिकतम करने के तरीके की तलाश में हैं, विंडो को आकार बदलने योग्य होने के लिए विशिष्ट आवश्यकता नहीं है। वर्तमान में यह "wpf विंडो अक्षम करें" क्वेरी के लिए शीर्ष परिणाम है और यह उत्तर सही ढंग से प्रश्न का उत्तर देता है। भले ही, शर्म की बात है कि एमएस ने शीर्षक पट्टी या पूरी खिड़की क्रोम को "बस एक और नियंत्रण या संपत्ति" के रूप में नहीं बनाया है। '90 ... –

3

यदि कोई भी डेवेक्सप्रेस विंडो (डीएक्सविंडो) का उपयोग स्वीकार करता है तो जवाब काम नहीं करता है। एक बदसूरत दृष्टिकोण

public partial class MyAwesomeWindow : DXWindow 
{ 
    public MyAwesomeWIndow() 
    { 
     Loaded += OnLoaded; 
    } 

    private void OnLoaded(object sender, RoutedEventArgs routedEventArgs) 
    { 
     // hides maximize button    
     Button button = (Button)DevExpress.Xpf.Core.Native.LayoutHelper.FindElementByName(this, DXWindow.ButtonParts.PART_Maximize.ToString()); 
     button.IsHitTestVisible = false; 
     button.Opacity = 0; 

     // hides minimize button 
     button = (Button)DevExpress.Xpf.Core.Native.LayoutHelper.FindElementByName(this, DXWindow.ButtonParts.PART_Minimize.ToString()); 
     button.IsHitTestVisible = false; 
     button.Opacity = 0; 

     // hides close button 
     button = (Button)DevExpress.Xpf.Core.Native.LayoutHelper.FindElementByName(this, DXWindow.ButtonParts.PART_CloseButton.ToString()); 
     button.IsHitTestVisible = false; 
     button.Opacity = 0; 
    } 
} 
+0

मैंने आपके जवाब को यहां देखने से पहले शायद पांच अलग-अलग पोस्ट पढ़ीं। यह काम करता है, लेकिन यक। क्या आपको कभी बेहतर तरीका मिला? – DonBoitnott

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