WPF में रिज़ॉल्यूशन विंडो से न्यूनतम और अधिकतम कैसे निकालूं?


80

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

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

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

जवाबों:


114

मैंने 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();
};

उम्मीद है की यह मदद करेगा!


3
विंडो में कुछ प्रीटियर कोड: संरक्षित ओवरराइड void OnSourceInitialized (EventArgs e) {base.OnSourceInitialized (e); यह। HideMinimizeAndMaximizeButtons (); }
दिमित्री शेट्टमैन

1
इसे और भी सरल क्यों न बनाया जाए और HideMinimizeAndMaximizeButtons () विधि में सही स्रोत स्रोत की सदस्यता लें? तब आप कंस्ट्रक्टर से विधि को कॉल कर सकते हैं और कुछ भी नहीं है।
जमतियात

1
यह समाधान शीर्षक-बार पर डबल-क्लिक को कवर नहीं करता है।
लोनली-लोकली

1
पुनरुत्थान नोट! विधि को विंडोज लोडेड घटना में डाला जाना चाहिए क्योंकि हैंडल को इनिशियलाइज्ड इवेंट में परिभाषित नहीं किया गया है।
SezMe

4
यह सब जानने के बाद कि यह कार्यक्षमता विंडोज़ रूपों में मौजूद है, मैं अभी यह नहीं समझता कि Microsoft ने इस तरह की कार्यक्षमता को शुरू से ही WPF में नहीं डाला था। स्पष्ट रूप से, एक कम से कम बॉक्स और अधिकतम पुस्तक के साथ एक संवाद अव्यवसायिक दिखता है, और कैप्शन बार का डबल क्लिक करना बस एक ही मुद्दा है। क्षमा करें, WPF पर मेरी हताशा को थोड़ा कम करने के लिए, यह बहुत अच्छा है और इसके पास स्ट्रिंग एसेट्स हैं लेकिन एक बार और जब आप किसी ऐसी चीज पर ठोकर खाते हैं जो सरल होनी चाहिए जो अंततः नहीं है।
फिलिप स्टीक

92

एक तरीका यह है कि अपना सेट करें ResizeMode="NoResize"। यह इस तरह का व्यवहार करेगा। यहाँ छवि विवरण दर्ज करें

आशा है कि ये आपकी मदद करेगा!


33
यह खिड़की को पुन: प्रयोज्य नहीं बनाता है, जो सीधे सवाल के विपरीत है।
मशमगर

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

2
इस स्थिति में डायनामिक चौड़ाई (जैसे DockPanel) वाले तत्व अभी भी विंडो का आकार बदलने में सक्षम हैं। लेकिन अब उपयोगकर्ता नहीं। इसलिए, यह विकल्प वास्तव में मेरी आवश्यकताओं को पूरा करता है।
वनवर्ल्ड

4
सवालों के जवाब नहीं देता, लेकिन मेरे लिए मददगार था। धन्यवाद।
dkantowitz

@EmipleOrionii उस समय जबकि यह पृष्ठ Google का शीर्ष परिणाम रहा हो सकता है, किसी भी तरह से इसका मतलब यह नहीं है कि यह जवाब सबसे अच्छा है जब आप इस पर विचार करते हैं कि "मैं कैसे निकालें और resizable windowWPF में अधिकतम से अधिकतम कैसे निकालूं ?" जब यह तैयार उत्पाद से "resizable" पहलू को हटा देता है । यह उस व्यक्ति की मदद करने जैसा है जो अपनी कार को लाल रंग में रंगना चाहता है और इस प्रक्रिया में आप इंजन को हटा देते हैं।
मिक्याद

22

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

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

3
यह लगभग काम करता है, लेकिन इसके बाद भी विंडो को अधिकतम या कम करना संभव है यदि आप टाइटल बार पर डबल क्लिक करते हैं, तो राइट क्लिक करें और यदि यह उपलब्ध है तो नियंत्रण मेनू या टास्कबार बटन का उपयोग करें। साथ ही निश्चित रूप से यह एक टूल विंडो की तरह दिखता है, सामान्य नहीं।
निडोनजॉय

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

यह उन स्थितियों के लिए आसान हो सकता है, जहां MaxWidth/ और / या MaxHeightखिड़की को सेट किया गया है।
ब्रेट रयान

6

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

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;
    } 
}

इससे पहले कि मैं आपका उत्तर नीचे देखूं, संभवत: मैंने पांच अलग-अलग पोस्ट पढ़ी। यह काम करता है, लेकिन हाँ। क्या आपने कभी बेहतर तरीका खोजा?
डॉनबाइटनॉट

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
उन्होंने पूछा कि बटन कैसे छिपाएं लेकिन कार्यक्षमता को बनाए रखें।
अलेक्जेंड्रू डिकु

जितना कम से कम यह है, खिड़की टिमटिमा रही है। इतना अच्छा नही है।
मुगें

2

यदि आप Minimize और Maximize का बटन हटाना चाहते हैं तो आप ResizeMode = "NoResize" विंडो को सेट कर सकते हैं


1
एह, लेकिन फिर आप इसे आकार नहीं दे सकते हैं
Karsten

0

@Matt Hamilton (और) द्वारा प्रस्तावित समाधान के इस प्रकार को विंडो के निर्माणकर्ता में बुलाया जा सकता है। SourceInitializedविस्तार विधि के भीतर घटना के लिए एक प्रतिनिधि को सदस्यता देना है ।

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);

/// <summary>
/// Hides the Minimize and Maximize buttons in a Window. Must be called in the constructor.
/// </summary>
/// <param name="window">The Window whose Minimize/Maximize buttons will be hidden.</param>
public static void HideMinimizeAndMaximizeButtons(this Window window)
{
    window.SourceInitialized += (s, e) => {
        IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(window).Handle;
        int currentStyle = GetWindowLong(hwnd, GWL_STYLE);

        SetWindowLong(hwnd, GWL_STYLE, currentStyle & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX);
    };
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.