ডাব্লুপিএফ উইন্ডোতে ক্লোজ বোতামটি কীভাবে আড়াল করবেন?


204

আমি ডাব্লুপিএফ-তে একটি মডেল ডায়ালগ লিখছি। ঘনিষ্ঠ বোতাম না রাখার জন্য আমি কীভাবে একটি ডাব্লুপিএফ উইন্ডো সেট করব? আমি এখনও এর জন্য চাইWindowState জন্য একটি সাধারণ শিরোনাম বার রাখা উচিত।

আমি খুঁজে পেয়েছি ResizeMode, WindowStateএবং WindowStyle, কিন্তু এই বৈশিষ্ট্যগুলির মধ্যে কোনওটিই আমাকে ঘনিষ্ঠ বোতামটি লুকানোর অনুমতি দেয় না তবে শিরোনাম দণ্ডটি প্রদর্শন করে, যেমন মোডাল সংলাপগুলি।


9
এটি একটি অগ্রগতি সংলাপ যা একটি ব্যাকগ্রাউন্ড থ্রেড চালাচ্ছে যা বাতিল করা সমর্থন করে না; আমার ধারণা আমি কেবল এটি তৈরির চেষ্টা করছি যাতে আমাকে বাতিল করার (এখনও) সমর্থন করতে হবে না। যদিও আপনি সম্ভবত ঠিক আছেন।
মাইকেল হেজ্পেপথ

1
আমি উইন্ডো ক্রোম সরানোর চেষ্টা করা অ্যাপ্লিকেশনগুলিকেও ঘৃণা করি। আমি যদি কোনও অগ্রগতি কথোপকথন করি, আমি উইন্ডোটি বন্ধ করুন বোতামটি প্রকৃত বাতিল বোতামটি ক্লিক করার মতো একই যুক্তিটি করে make
খ্রিস্টান হাইটার

13
ক্রিসের জন্য: আপনার সফ্টওয়্যারটি ভিডিও নজরদারির জন্য কল্পনা করুন। রাতের সময় একটি সুরক্ষা এজেন্ট উইন্ডোজ খোলা রাখার জন্য (এটি তাঁর কাজ) ... তবে কখনও কখনও তাদের কাজটি বিরক্তিকর হয় এবং তারা কোনও কারণেই ইন্টারনেট সার্ফ করতে বা ভিডিও ম্যাট্রিকেস উইন্ডোজ বন্ধ করতে চায়, উইন্ডোজের বোতামগুলি সরিয়ে ফেলা সঠিক উপায় এটা করতে।
জিন-মেরি

7
@ ক্রিসআপচার্চ, "আপনি এটি করতে চান কেন? এটি আমাকে সত্যই উজ্জ্বল ইউআই ডিজাইন হিসাবে আঘাত করে" " - সত্যই" লসি ইউআই ডিজাইন "হয় যখন কোনও প্রোগ্রাম ঠিক আছে , এমন একটি ডায়ালগ বক্স উপস্থাপন করে ; বাতিল এবং বোতাম বন্ধ করুন । ব্যবহারকারীর কাছে ক্লোজ কী করবে তা স্পষ্ট নয় । এটি বাতিল বা জমা দেয় ?
Sensক্যমত্যটি

1
@ জিন-মেরি তবে কাছের বোতামটি আড়াল করে তা ঘটতে বাধা দেয় না, এটি কেবল অজ্ঞাত এবং অলসকে (গুগলের কাছে) বোকা বানাবে। ঘনিষ্ঠ বোতামটি লুকানো কেবলমাত্র সেই বোতামটি ক্লিক করা বাধা দেয়। উইন কী এবং এলইটি কী কম্বোগুলি এখনও স্বাভাবিক হিসাবে কাজ করবে এটি করার "সঠিক" উপায়টি হল, একটি গ্রুপ নীতি যা শ্রমিকদের অনুমোদন ব্যতীত অন্য কোনও সফ্টওয়্যার খোলার / ইনস্টল করা থেকে বিরত রাখে এমন একটি নীতি যা শ্রমিকদের জন্য একটি অ্যাকাউন্ট তৈরি করে। অ্যাডমিন অ্যাকাউন্ট, যে কোনও রক্ষণাবেক্ষণ পরিচালনা করতে সুপারভাইজারদের অ্যাক্সেস থাকে।
ডিজিটাল_উটোপিয়া

উত্তর:


275

শিরোনাম বারের ক্লোজ বোতামটি লুকানোর জন্য ডাব্লুপিএফ-তে অন্তর্নির্মিত সম্পত্তি নেই তবে আপনি পি / ইনভোকের কয়েকটি লাইন দিয়ে এটি করতে পারেন।

প্রথমে আপনার উইন্ডো শ্রেণিতে এই ঘোষণাগুলি যুক্ত করুন:

private const int GWL_STYLE = -16;
private const int WS_SYSMENU = 0x80000;
[DllImport("user32.dll", SetLastError = true)]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

তারপরে উইন্ডোর Loadedইভেন্টে এই কোডটি রাখুন :

var hwnd = new WindowInteropHelper(this).Handle;
SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SYSMENU);

এবং সেখানে আপনি যান: আর ক্লোজ বোতাম নেই। আপনি শিরোনাম বারের বাম দিকে উইন্ডো আইকনটিও পাবেন না, যার অর্থ কোনও সিস্টেম মেনু নেই, এমনকি যখন আপনি শিরোনাম বারটিতে ডান ক্লিক করেন - তারা সবাই একসাথে যায়।

নোট করুন যে Alt+ F4উইন্ডোটি এখনও বন্ধ করবে। আপনি যদি পটভূমি থ্রেডটি সম্পন্ন করার আগে উইন্ডোটি বন্ধ হওয়ার অনুমতি না দিতে চান, তবে আপনি গ্যাবের পরামর্শ অনুসারে ওভাররাইড OnClosingএবং Cancelসত্যতেও সেট করতে পারেন।


5
ডক্স অনুযায়ী আমাদের SetWindowLongPtrপরিবর্তে ব্যবহার করা উচিত ।
জোনাথন অ্যালেন

15
বেশিরভাগ ক্ষেত্রে নিজের কাছে একটি নোট ... DllImport -> System.Runtime.InteropServices.DllImport এর নেমস্পেস। উইন্ডোআইনটারেপ হেল্পারের নামস্থান -> সিস্টেম.
উইন্ডোস.ইনটারপ.উন্ডোআইন্টারভেল্প

3
আসলে, এই পদ্ধতির তিনটি বোতাম (ন্যূনতম, সর্বাধিক এবং বন্ধ) লুকিয়ে রাখে ides ক্লোজ বোতামটি কী লুকিয়ে রাখা সম্ভব?
নিউম্যান

4
@ মিলি, না আপনি এটি অক্ষম করতে পারেন, তবে আপনি এটি মিনিমাইজ / ম্যাক্সিমাইজও গোপন না করে আড়াল করতে পারবেন না। আমি সন্দেহ করি যে উইন্ডোজ ডেভস ভেবেছিল ম্যাক্সিমাইজ ডানদিকে যেখানে ক্লোজ সাধারণত থাকে সেখানে থাকলে বিভ্রান্তিকর হবে।
জো হোয়াইট

3
এক্সএএমএল ফাইলটিতে আপনার উইন্ডো ট্যাগে উইন্ডোস্টাইল = "কিছুই নয়" রাখুন।
ডায়াগডস্প্প

88

আমি ঠিক একই ধরণের সমস্যার মুখোমুখি হয়েছি এবং জো হোয়াইটের সমাধানটি আমার কাছে সহজ এবং পরিষ্কার বলে মনে হচ্ছে। আমি এটিকে পুনরায় ব্যবহার করেছি এবং এটিকে উইন্ডোর সংযুক্ত সম্পত্তি হিসাবে সংজ্ঞায়িত করেছি

public class WindowBehavior
{
    private static readonly Type OwnerType = typeof (WindowBehavior);

    #region HideCloseButton (attached property)

    public static readonly DependencyProperty HideCloseButtonProperty =
        DependencyProperty.RegisterAttached(
            "HideCloseButton",
            typeof (bool),
            OwnerType,
            new FrameworkPropertyMetadata(false, new PropertyChangedCallback(HideCloseButtonChangedCallback)));

    [AttachedPropertyBrowsableForType(typeof(Window))]
    public static bool GetHideCloseButton(Window obj) {
        return (bool)obj.GetValue(HideCloseButtonProperty);
    }

    [AttachedPropertyBrowsableForType(typeof(Window))]
    public static void SetHideCloseButton(Window obj, bool value) {
        obj.SetValue(HideCloseButtonProperty, value);
    }

    private static void HideCloseButtonChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var window = d as Window;
        if (window == null) return;

        var hideCloseButton = (bool)e.NewValue;
        if (hideCloseButton && !GetIsHiddenCloseButton(window)) {
            if (!window.IsLoaded) {
                window.Loaded += HideWhenLoadedDelegate;
            }
            else {
                HideCloseButton(window);
            }
            SetIsHiddenCloseButton(window, true);
        }
        else if (!hideCloseButton && GetIsHiddenCloseButton(window)) {
            if (!window.IsLoaded) {
                window.Loaded -= ShowWhenLoadedDelegate;
            }
            else {
                ShowCloseButton(window);
            }
            SetIsHiddenCloseButton(window, false);
        }
    }

    #region Win32 imports

    private const int GWL_STYLE = -16;
    private const int WS_SYSMENU = 0x80000;
    [DllImport("user32.dll", SetLastError = true)]
    private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
    [DllImport("user32.dll")]
    private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

    #endregion

    private static readonly RoutedEventHandler HideWhenLoadedDelegate = (sender, args) => {
        if (sender is Window == false) return;
        var w = (Window)sender;
        HideCloseButton(w);
        w.Loaded -= HideWhenLoadedDelegate;
    };

    private static readonly RoutedEventHandler ShowWhenLoadedDelegate = (sender, args) => {
        if (sender is Window == false) return;
        var w = (Window)sender;
        ShowCloseButton(w);
        w.Loaded -= ShowWhenLoadedDelegate;
    };

    private static void HideCloseButton(Window w) {
        var hwnd = new WindowInteropHelper(w).Handle;
        SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SYSMENU);
    }

    private static void ShowCloseButton(Window w) {
        var hwnd = new WindowInteropHelper(w).Handle;
        SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) | WS_SYSMENU);
    }

    #endregion

    #region IsHiddenCloseButton (readonly attached property)

    private static readonly DependencyPropertyKey IsHiddenCloseButtonKey =
        DependencyProperty.RegisterAttachedReadOnly(
            "IsHiddenCloseButton",
            typeof (bool),
            OwnerType,
            new FrameworkPropertyMetadata(false));

    public static readonly DependencyProperty IsHiddenCloseButtonProperty =
        IsHiddenCloseButtonKey.DependencyProperty;

    [AttachedPropertyBrowsableForType(typeof(Window))]
    public static bool GetIsHiddenCloseButton(Window obj) {
        return (bool)obj.GetValue(IsHiddenCloseButtonProperty);
    }

    private static void SetIsHiddenCloseButton(Window obj, bool value) {
        obj.SetValue(IsHiddenCloseButtonKey, value);
    }

    #endregion

}

তারপরে এক্সএএমএল-এ আপনি ঠিক এটি সেট করেছেন:

<Window 
    x:Class="WafClient.Presentation.Views.SampleWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:u="clr-namespace:WafClient.Presentation.Behaviors"
    ResizeMode="NoResize"
    u:WindowBehavior.HideCloseButton="True">
    ...
</Window>

62

কোনওটিতে WindowStyleসম্পত্তি সেট করুন যা শিরোনাম বারের সাথে নিয়ন্ত্রণ বাক্সটি লুকিয়ে রাখবে। কার্নাল কল করার দরকার নেই।


20
ঠিক আছে, এটি উইন্ডো শিরোনাম বার সম্পূর্ণরূপে আড়াল করবে। এর অর্থ আপনি উইন্ডো শিরোনাম পাবেন না এবং ব্যবহারকারী উইন্ডোটি সরাতে পারবেন না।
নিউম্যান

6
this.DragMove();উইন্ডোটির MouseDownইভেন্টে যোগ করে আপনি উইন্ডোটিকে অস্থাবর করতে পারেন
পল

1
একটি মোডাল কথোপকথনের জন্য যা সম্পূর্ণরূপে তথ্যবহুল এবং বাধ্যতামূলক হওয়া উচিত, যেমন একটি পুরানো স্কিমা খোলার সাথে ডেটাবেস আপগ্রেড করার অগ্রগতির মতো, এই সমাধানটি নিখুঁত।
নিঃসঙ্গ কোডার

1
আমি মনে করি কিছু লোকেরা একটি সীমানা রাখতে চাইবে, যদিও
pjdupreez

2
অবশ্যই সেরা সমাধান। প্যানেলে সীমানা যুক্ত করা বা চলন বাস্তবায়নে কোনও সমস্যা নেই।
49

50

এটি বন্ধ বোতামটি থেকে মুক্তি পাবে না, তবে এটি কারও উইন্ডোটি বন্ধ করা বন্ধ করবে।

এটি ফাইলের পিছনে আপনার কোডে রাখুন:

protected override void OnClosing(CancelEventArgs e)
{
   base.OnClosing(e);
   e.Cancel = true;
}

7
সচেতন থাকুন যে Windowকোনও মডেল ডায়ালগ হিসাবে সেট আপ করা হয়েছে এমনটি করার ফলে Windowএটির DialogResultসম্পত্তি সেট করার ক্ষেত্রে হস্তক্ষেপ হবে এবং এটি অকেজো হয়ে উঠতে পারে। stackoverflow.com/questions/898708/cant-set-dialogresult-in-wpf
শেরিডান

4
আমি এই পদ্ধতিটি ব্যবহার করে একটি উপচে পড়ছি, আমি বেসটি বের করেছিলাম C বন্ধ করে (ঙ) এবং তারপরে এটি কাজ করেছিল
জ্যাকবসগ্রিফিথ

8
একজন ব্যবহারকারী হিসাবে আমি সেই প্রোগ্রামারকে ঘৃণা করব যা তাদের এপ্লিকেশনটিতে
রেখেছিল

2
@ আরবানএএসসি আমি সম্মতি জানাতে চাই যে এটি করা একটি বিরক্তিকর কাজ, তবে যখন আমি এটি করেছি - এবং এটি কেবল এক সময় ছিল - এটি একটি বাধ্যতামূলক প্রয়োজন ছিল, এবং এটি একটি প্রয়োজনীয় মন্দ ছিল, সেখানে কিছু খুব গুরুত্বপূর্ণ প্রক্রিয়া চলছে was এতে বাধা দেওয়া গেল না এবং কাজ শেষ না হওয়া পর্যন্ত অ্যাপটি এগিয়ে যেতে পারল না। এটি করা যেতে পারে এমন অন্যান্য উপায়ও ছিল (পটভূমি থ্রেড, ইউআই প্রস্তুত না হওয়া পর্যন্ত অক্ষম ছিল) তবে বস এবং ক্লায়েন্ট উভয়ই এটি পছন্দ করেছেন কারণ এটি প্রক্রিয়াটির গুরুতরতার উপর জোর দেয়।
ফ্লুরবিয়াস

15

বন্ধ বোতামটি অক্ষম করতে আপনার উইন্ডো শ্রেণিতে নিম্নলিখিত কোডটি যুক্ত করা উচিত (কোডটি এখান থেকে নেওয়া হয়েছিল , কিছুটা সম্পাদিত ও পুনরায় ফর্ম্যাট করা হয়েছিল):

protected override void OnSourceInitialized(EventArgs e)
{
    base.OnSourceInitialized(e);

    HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;

    if (hwndSource != null)
    {
        hwndSource.AddHook(HwndSourceHook);
    }

}

private bool allowClosing = false;

[DllImport("user32.dll")]
private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
[DllImport("user32.dll")]
private static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable);

private const uint MF_BYCOMMAND = 0x00000000;
private const uint MF_GRAYED = 0x00000001;

private const uint SC_CLOSE = 0xF060;

private const int WM_SHOWWINDOW = 0x00000018;
private const int WM_CLOSE = 0x10;

private IntPtr HwndSourceHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    switch (msg)
    {
        case WM_SHOWWINDOW:
            {
                IntPtr hMenu = GetSystemMenu(hwnd, false);
                if (hMenu != IntPtr.Zero)
                {
                    EnableMenuItem(hMenu, SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);
                }
            }
            break;
        case WM_CLOSE:
            if (!allowClosing)
            {
                handled = true;
            }
            break;
    }
    return IntPtr.Zero;
}

এই কোডটি সিস্টেম মেনুতে ঘনিষ্ঠ আইটেমকে অক্ষম করে এবং Alt + F4 ব্যবহার করে ডায়ালগটি বন্ধ করার অনুমতি দেয় না।

আপনি সম্ভবত প্রোগ্রামটিমে উইন্ডোটি বন্ধ করতে চাইবেন। শুধু কলিংয়ের Close()কাজ হবে না। এরকম কিছু করুন:

allowClosing = true;
Close();

উইন্ডোজ 7 এ: উপরেরগুলি ড্রপ-ডাউন সিস্টেম মেনুতে বন্ধ আইটেমটি অক্ষম করে (তবে সরিয়ে দেয় না)। ক্লোজ বোতামটি নিজেই অক্ষম (ধূসর দেখায়), তবে সরানো হয়নি। এই কৌশলটি মিনিমাইজ / ম্যাক্সিমাইজ আইটেম / বোতামটির জন্য কাজ করে না - আমার সন্দেহ হয় যে ডাব্লুপিএফ সেগুলি পুনরায় সক্ষম করে।

3
বোতামটি অক্ষম করা কেবল এগুলি অপসারণের চেয়ে ভাল, এটি ব্যবহারকারীকে জানিয়ে দেয় যে একটি গুরুত্বপূর্ণ অপারেশন চলছে।
রবার্ট বেকার

10

আমি ভাইচাসলউয়ের উত্তরটি চেষ্টা করছিলাম যেহেতু আমি বোতামটি সরিয়ে না ফেলে এটি নিষ্ক্রিয় করার ধারণা পছন্দ করি তবে কোনও কারণে এটি সর্বদা কার্যকর হয় না: বন্ধ বোতামটি এখনও সক্ষম ছিল তবে কোনও ত্রুটি নেই।

অন্যদিকে এটি সর্বদা কাজ করে (ত্রুটি বাদ দেওয়া বাদ দিয়ে):

[DllImport( "user32.dll" )]
private static extern IntPtr GetSystemMenu( IntPtr hWnd, bool bRevert );
[DllImport( "user32.dll" )]
private static extern bool EnableMenuItem( IntPtr hMenu, uint uIDEnableItem, uint uEnable );

private const uint MF_BYCOMMAND = 0x00000000;
private const uint MF_GRAYED = 0x00000001;
private const uint SC_CLOSE = 0xF060;
private const int WM_SHOWWINDOW = 0x00000018;

protected override void OnSourceInitialized( EventArgs e )
{
  base.OnSourceInitialized( e );
  var hWnd = new WindowInteropHelper( this );
  var sysMenu = GetSystemMenu( hWnd.Handle, false );
  EnableMenuItem( sysMenu, SC_CLOSE, MF_BYCOMMAND | MF_GRAYED );
}

1
পারফেক্ট! Windowআমার প্রকল্পে একটি এক্সটেনশন পদ্ধতি হিসাবে যুক্ত করা হয়েছে ।
ম্যাট ডেভিস

8

সেট করার সম্পত্তিটি হল => WindowStyle="None"

<Window x:Class="mdaframework.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Start" Height="350" Width="525" ResizeMode="NoResize"  WindowStartupLocation="CenterScreen" WindowStyle="None">

4
এটি সর্বাধিক / মিনিট বোতামগুলিও লুকিয়ে রাখে
ভোটকফি

3
এটি পুরো শিরোনাম বারটি সরিয়ে দেয়, বাক্সটিকে কুৎসিত করে এবং বিবরণ ছাড়াই। শটগান পদ্ধতির এবং একটি সদৃশ উত্তর। Downvote।
vapcguy

এটি কিওস্ক অ্যাপ্লিকেশনগুলির জন্য সেরা সমাধান যা সর্বদা এর অ্যাপ্লিকেশনটি সর্বাধিক বাড়ানো দরকার এবং গ্রাহকদের অ্যাপ বন্ধ করার অনুমতি দেওয়া উচিত নয়। তাই আপভোট
রাজন তন্দুকার

8

আমি কেবল জো হোয়াইটের উত্তরের আমার বাস্তবায়ন যুক্ত করছি ইন্টার করে ইন্টারেক্টিভিটি বিহ্যাভিয়ারটি ব্যবহার করেছি (আপনার সিস্টেমের কথা উল্লেখ করা দরকার ind উইন্ডোজ I ইন্টারেক্টিভিটি)।

কোড:

public class HideCloseButtonOnWindow : Behavior<Window>
{
    #region bunch of native methods

    private const int GWL_STYLE = -16;
    private const int WS_SYSMENU = 0x80000;

    [DllImport("user32.dll", SetLastError = true)]
    private static extern int GetWindowLong(IntPtr hWnd, int nIndex);

    [DllImport("user32.dll")]
    private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

    #endregion

    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.Loaded += OnLoaded;
    }

    protected override void OnDetaching()
    {
        AssociatedObject.Loaded -= OnLoaded;
        base.OnDetaching();
    }

    private void OnLoaded(object sender, RoutedEventArgs e)
    {
        var hwnd = new WindowInteropHelper(AssociatedObject).Handle;
        SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SYSMENU);
    }
}

ব্যবহার:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:w="clr-namespace:WpfApplication2">

    <i:Interaction.Behaviors>
        <w:HideCloseButtonOnWindow />
    </i:Interaction.Behaviors>

</Window>

2

ব্যবহারকারীর উইন্ডোটি "বন্ধ" করতে দিন তবে সত্যই এটি লুকান।

উইন্ডোটির অনক্লোজিং ইভেন্টে, ইতিমধ্যে দৃশ্যমান থাকলে উইন্ডোটি আড়াল করুন:

    If Me.Visibility = Windows.Visibility.Visible Then
        Me.Visibility = Windows.Visibility.Hidden
        e.Cancel = True
    End If

প্রতিবার পটভূমি থ্রেডটি কার্যকর করা হবে, ব্যাকগ্রাউন্ডের ইউআই উইন্ডোটি পুনরায় দেখান:

    w.Visibility = Windows.Visibility.Visible
    w.Show()

প্রোগ্রামটি কার্যকর করার সময়, নিশ্চিত হয়ে নিন যে সমস্ত উইন্ডোজ বন্ধ / বন্ধ রয়েছে:

Private Sub CloseAll()
    If w IsNot Nothing Then
        w.Visibility = Windows.Visibility.Collapsed ' Tell OnClosing to really close
        w.Close()
    End If
End Sub

1

সুতরাং, বেশিরভাগ এখানে আপনার সমস্যা। উইন্ডো ফ্রেমের উপরের ডানদিকে বন্ধ বোতামটি ডাব্লুপিএফ উইন্ডোর অংশ নয়, তবে এটি উইন্ডো ফ্রেমের অংশের সাথে সম্পর্কিত যা আপনার ওএস দ্বারা নিয়ন্ত্রিত। এর অর্থ এটি করতে আপনাকে উইন 32 ইন্টারপ ব্যবহার করতে হবে।

পর্যায়ক্রমে, আপনি নোফ্রেম ব্যবহার করতে পারেন এবং হয় আপনার নিজের "ফ্রেম" সরবরাহ করতে পারেন বা কোনও ফ্রেম নেই।


1

নীচেরটি বন্ধ এবং ম্যাক্সিমাইজ / মিনিমাইজ বোতামগুলি অক্ষম করার বিষয়ে রয়েছে, এটি হয় না আসলে বোতামগুলি সরিয়ে (তবে এটি মেনু আইটেমগুলি সরিয়ে দেয়!) শিরোনাম বারের বোতামগুলি অক্ষম / ধূসর অবস্থায় আঁকা। (আমি নিজে নিজে সমস্ত কার্যকারিতা গ্রহণ করতে প্রস্তুত নই ^^)

এটি ভার্জোগ সমাধানের তুলনায় কিছুটা পৃথক যে এটি কেবলমাত্র অক্ষম না করে মেনু আইটেমগুলি (এবং প্রয়োজন অনুসারে পিছনকারী বিভাজক) সরিয়ে দেয়। এটি জো হোয়াইটের সমাধান থেকে আলাদা কারণ এটি পুরো সিস্টেম মেনুটিকে অক্ষম করে না এবং তাই আমার ক্ষেত্রে আমি মিনিমাইজ বোতাম এবং আইকনটি রাখতে পারি around

/ বোতাম, যেমন বন্ধ বোতাম অসদৃশ, মেনু থেকে এন্ট্রি অপসারণ সিস্টেম বোতাম "অক্ষম" রেন্ডার করতে যদিও মেনু এন্ট্রি মুছে ফেলার কারণ হবে না ছোট করুন ফলো কোড এছাড়াও সর্বাধিক নিষ্ক্রিয় সমর্থন করে বোতাম অক্ষম কার্যকারিতা।

এটা আমার জন্য কাজ করে. YMMV।

    using System;
    using System.Collections.Generic;
    using System.Text;

    using System.Runtime.InteropServices;
    using Window = System.Windows.Window;
    using WindowInteropHelper = System.Windows.Interop.WindowInteropHelper;
    using Win32Exception = System.ComponentModel.Win32Exception;

    namespace Channelmatter.Guppy
    {

        public class WindowUtil
        {
            const int MF_BYCOMMAND = 0x0000;
            const int MF_BYPOSITION = 0x0400;

            const uint MFT_SEPARATOR = 0x0800;

            const uint MIIM_FTYPE = 0x0100;

            [DllImport("user32", SetLastError=true)]
            private static extern uint RemoveMenu(IntPtr hMenu, uint nPosition, uint wFlags);

            [DllImport("user32", SetLastError=true)]
            private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

            [DllImport("user32", SetLastError=true)]
            private static extern int GetMenuItemCount(IntPtr hWnd);

            [StructLayout(LayoutKind.Sequential)]
            public struct MenuItemInfo {
                public uint   cbSize;
                public uint   fMask;
                public uint   fType;
                public uint   fState;
                public uint   wID;
                public IntPtr hSubMenu;
                public IntPtr hbmpChecked;
                public IntPtr hbmpUnchecked;
                public IntPtr dwItemData; // ULONG_PTR
                public IntPtr dwTypeData;
                public uint   cch;
                public IntPtr hbmpItem;
            };

            [DllImport("user32", SetLastError=true)]
            private static extern int GetMenuItemInfo(
                IntPtr hMenu, uint uItem,
                bool fByPosition, ref MenuItemInfo itemInfo);

            public enum MenuCommand : uint
            {
                SC_CLOSE = 0xF060,
                SC_MAXIMIZE = 0xF030,
            }

            public static void WithSystemMenu (Window win, Action<IntPtr> action) {
                var interop = new WindowInteropHelper(win);
                IntPtr hMenu = GetSystemMenu(interop.Handle, false);
                if (hMenu == IntPtr.Zero) {
                    throw new Win32Exception(Marshal.GetLastWin32Error(),
                        "Failed to get system menu");
                } else {
                    action(hMenu);
                }
            }

            // Removes the menu item for the specific command.
            // This will disable and gray the Close button and disable the
            // functionality behind the Maximize/Minimuze buttons, but it won't
            // gray out the Maximize/Minimize buttons. It will also not stop
            // the default Alt+F4 behavior.
            public static void RemoveMenuItem (Window win, MenuCommand command) {
                WithSystemMenu(win, (hMenu) => {
                    if (RemoveMenu(hMenu, (uint)command, MF_BYCOMMAND) == 0) {
                        throw new Win32Exception(Marshal.GetLastWin32Error(),
                            "Failed to remove menu item");
                    }
                });
            }

            public static bool RemoveTrailingSeparator (Window win) {
                bool result = false; // Func<...> not in .NET3 :-/
                WithSystemMenu(win, (hMenu) => {
                    result = RemoveTrailingSeparator(hMenu);
                });
                return result;
            }

            // Removes the final trailing separator of a menu if it exists.
            // Returns true if a separator is removed.
            public static bool RemoveTrailingSeparator (IntPtr hMenu) {
                int menuItemCount = GetMenuItemCount(hMenu);
                if (menuItemCount < 0) {
                    throw new Win32Exception(Marshal.GetLastWin32Error(),
                        "Failed to get menu item count");
                }
                if (menuItemCount == 0) {
                    return false;
                } else {
                    uint index = (uint)(menuItemCount - 1);
                    MenuItemInfo itemInfo = new MenuItemInfo {
                        cbSize = (uint)Marshal.SizeOf(typeof(MenuItemInfo)),
                        fMask = MIIM_FTYPE,
                    };

                    if (GetMenuItemInfo(hMenu, index, true, ref itemInfo) == 0) {
                        throw new Win32Exception(Marshal.GetLastWin32Error(),
                            "Failed to get menu item info");
                    }

                    if (itemInfo.fType == MFT_SEPARATOR) {
                        if (RemoveMenu(hMenu, index, MF_BYPOSITION) == 0) {
                            throw new Win32Exception(Marshal.GetLastWin32Error(),
                                "Failed to remove menu item");
                        }
                        return true;
                    } else {
                        return false;
                    }
                }
            }

            private const int GWL_STYLE = -16;

            [Flags]
            public enum WindowStyle : int
            {
                WS_MINIMIZEBOX = 0x00020000,
                WS_MAXIMIZEBOX = 0x00010000,
            }

            // Don't use this version for dealing with pointers
            [DllImport("user32", SetLastError=true)]
            private static extern int SetWindowLong (IntPtr hWnd, int nIndex, int dwNewLong);

            // Don't use this version for dealing with pointers
            [DllImport("user32", SetLastError=true)]
            private static extern int GetWindowLong (IntPtr hWnd, int nIndex);

            public static int AlterWindowStyle (Window win,
                WindowStyle orFlags, WindowStyle andNotFlags) 
            {
                var interop = new WindowInteropHelper(win);

                int prevStyle = GetWindowLong(interop.Handle, GWL_STYLE);
                if (prevStyle == 0) {
                    throw new Win32Exception(Marshal.GetLastWin32Error(),
                        "Failed to get window style");
                }

                int newStyle = (prevStyle | (int)orFlags) & ~((int)andNotFlags);
                if (SetWindowLong(interop.Handle, GWL_STYLE, newStyle) == 0) {
                    throw new Win32Exception(Marshal.GetLastWin32Error(),
                        "Failed to set window style");
                }
                return prevStyle;
            }

            public static int DisableMaximizeButton (Window win) {
                return AlterWindowStyle(win, 0, WindowStyle.WS_MAXIMIZEBOX);
            }
        }
    }

ব্যবহার: উত্সটি শুরু করার পরে এটি অবশ্যই করা উচিত। উইন্ডোর সোর্স-ইনিশিয়ালাইজড ইভেন্টটি ব্যবহার করা ভাল জায়গা:

Window win = ...; /* the Window :-) */
WindowUtil.DisableMaximizeButton(win);
WindowUtil.RemoveMenuItem(win, WindowUtil.MenuCommand.SC_MAXIMIZE);
WindowUtil.RemoveMenuItem(win, WindowUtil.MenuCommand.SC_CLOSE);
while (WindowUtil.RemoveTrailingSeparator(win)) 
{
   //do it here
}

অল্ট + এফ 4 কার্যকারিতা অক্ষম করার সহজ পদ্ধতিটি হ'ল বাতিলকরণ ইভেন্টটি ওয়্যার আপ করা এবং আপনি যখন সত্যিই উইন্ডোটি বন্ধ করতে চান তখন এর জন্য একটি পতাকা সেট ব্যবহার করুন।


0

এক্সএএমএল কোড

<Button Command="Open" Content="_Open">
    <Button.Style>
        <Style TargetType="Button">
            <Style.Triggers>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter Property="Visibility" Value="Collapsed" />
                </Trigger>
            </Style.Triggers>
        </Style>
     </Button.Style>
</Button>

কাজ করা উচিত

আপনার তাত্ক্ষণিক এই থ্রেডের জন্য সম্পাদনা করুন দেখায় যে এটি কীভাবে করা যায় তবে আমি মনে করি না উইন্ডোটির সাধারণ শিরোনাম দণ্ডটি না হারিয়ে আপনি যা চান তার পাওয়ার কোনও সম্পত্তি আছে।

2 সম্পাদনা করুন এই থ্রেডটি এটি করার একটি উপায় দেখায়, তবে আপনাকে অবশ্যই সিস্টেম মেনুতে আপনার নিজস্ব স্টাইল প্রয়োগ করতে হবে এবং এটি কীভাবে করতে পারে তার একটি উপায় দেখায়।


কোনও কারণে "কাজ করা উচিত" কেবল প্রদর্শিত হয়েছিল, তবে এখন আপডেট হয়েছে
টিস্টম্পার

3
আমি উইন্ডো রাষ্ট্রের কথা বলছি, যা শিরোনাম বারে রয়েছে। এটি দেখতে সাধারণ বোতামটি সম্পাদনা করার মতো।
মাইকেল হেজ্পেপথ

@ টিম্প্পার, আমি কীভাবে আপনার স্নিপেট ব্যবহার করব? আমি একটি বৈশ্বিক উইন্ডো শৈলী (এবং টেম্পলেট) ব্যবহার করছি।
শিমি ওয়েইটস্যান্ডলার

@ শিমি- আপনি কোনটির কথা উল্লেখ করছেন?
টিস্টেম্পার

0

উইন্ডোতে একটি সমাপ্ত ইভেন্ট যুক্ত করার চেষ্টা করুন। ইভেন্ট হ্যান্ডলারে এই কোডটি যুক্ত করুন।

e.Cancel = true;

এটি উইন্ডোটি বন্ধ হতে বাধা দেবে। এটি ক্লোজ বোতামটি লুকিয়ে রাখার মতো একই প্রভাব ফেলে।


1
"এটি ক্লোজ বোতামটি লুকানোর মতোই প্রভাব ফেলছে" " বাটনটি এখনও দৃশ্যমান এবং ক্লিকযোগ্য, অর্থাৎ এটি অ্যানিমেটেড এবং যখন আপনি এটি ক্লিক করেন তখন দর্শনীয়ভাবে হতাশ করে - যা পোলাটিকে অস্বীকার করে
rory.ap

0

এটি ব্যবহার করুন, https://stephenhaunts.com/2014/09/25/remove-the-close-button-from-a-wpf-window থেকে পরিবর্তিত :

using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;

namespace Whatever
{
    public partial class MainMenu : Window
    {
        private const int GWL_STYLE = -16;
        private const int WS_SYSMENU = 0x00080000;

        [DllImport("user32.dll", SetLastError = true)]
        private static extern int GetWindowLongPtr(IntPtr hWnd, int nIndex);

        [DllImport("user32.dll")]
        private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

        public MainMenu()
        {
             InitializeComponent();
             this.Loaded += new RoutedEventHandler(Window_Loaded);
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            var hwnd = new WindowInteropHelper(this).Handle;
            SetWindowLongPtr(hwnd, GWL_STYLE, GetWindowLongPtr(hwnd, GWL_STYLE) & ~WS_SYSMENU);
        }  

    }
}

0

এটি বোতামটি আড়াল করে না তবে উইন্ডোটি বন্ধ করে ব্যবহারকারীর এগিয়ে যাওয়া থেকে বিরত থাকবে।

protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{            
    if (e.Cancel == false)
    {
        Application.Current.Shutdown();
    }
}

-1

যাও উইন্ডো বৈশিষ্ট্য সেট

window style = none;

আপনি কাছাকাছি বোতাম পাবেন না ...


Downvote। এটি আসলে WindowStyle = "None"- আপনার সিনট্যাক্সটি দেখুন। অন্যটির জন্য, এটি শটগান পদ্ধতির সাহায্যে শিরোনাম বারটি সরিয়ে দেয়, বাক্সটিকে কুশ্রী করে তোলে এবং শিরোনামের অভাব হয়, যখন এটি পরিচালনা করার জন্য আরও অনেক ভাল উপায় রয়েছে (অন্য উত্তরগুলির দ্বারা প্রমাণিত হিসাবে), এবং এটি একটি সদৃশ উত্তর।
vapcguy

-1

অন্যান্য উত্তরে যেমন বলা হয়েছে, আপনি WindowStyle="None"শিরোনাম বার পুরোপুরি অপসারণ করতে ব্যবহার করতে পারেন।

এবং, এই অন্যান্য উত্তরের মন্তব্যে যেমন বলা হয়েছে, এটি উইন্ডোটিকে ড্রাগযোগ্য হতে বাধা দেয় তাই এটির প্রাথমিক অবস্থান থেকে সরিয়ে নেওয়া শক্ত।

যাইহোক, আপনি উইন্ডো কোড পিছনে ফাইলটিতে কনস্ট্রাক্টরে কোডের একক লাইন যুক্ত করে এটি কাটিয়ে উঠতে পারেন:

MouseDown += delegate { DragMove(); };

অথবা, আপনি যদি ল্যাম্বদা সিনট্যাক্স পছন্দ করেন:

MouseDown += (sender, args) => DragMove();

এটি পুরো উইন্ডোটিকে টেনে আনেযোগ্য করে তোলে। উইন্ডোতে উপস্থিত কোনও ইন্টারেক্টিভ নিয়ন্ত্রণ যেমন বাটনগুলি এখনও স্বাভাবিক হিসাবে কাজ করবে এবং উইন্ডোটির জন্য ড্রাগ-হ্যান্ডলগুলির মতো কাজ করবে না।


এখনও একটি খারাপ ধারণা। এটি পুরো শিরোনাম দণ্ডটিকে সরিয়ে দেয়, এটি একটি শটগান পদ্ধতির তৈরি করে এবং বাক্সটিকে কুরুচিপূর্ণ করে তোলে এবং এর কোনও শিরোনাম / বিবরণ নেই। আরও অনেক ভাল বিকল্প আছে।
vapcguy

@vapcguy এটি পুরো শিরোনাম বারটি সরিয়ে দেয়। এটি একটি শটগান পদ্ধতির। বক্সটিকে কুরুচিপূর্ণ দেখাচ্ছে? আপনার মতামত. আরও ভাল বিকল্প? আপনার জন্য, সম্ভবত। সবার জন্য নয়। :-)
হোল্ফ

-1

এর উত্তরের জন্য অনেক অনুসন্ধান করার পরে, আমি এই সহজ সমাধানটি নিয়ে কাজ করেছি যা আমি এখানে আশাবাদে ভাগ করব এটি অন্যকে সহায়তা করে।

আমি সেট WindowStyle=0x10000000

এটি উইন্ডো স্টাইলের জন্য WS_VISIBLE (0x10000000)এবং WS_OVERLAPPED (0x0)মানগুলি সেট করে । শিরোনাম বার এবং উইন্ডো সীমানা প্রদর্শনের জন্য "ওভারল্যাপড" প্রয়োজনীয় মান। সরানোর মাধ্যমে WS_MINIMIZEBOX (0x20000), WS_MAXIMIZEBOX (0x10000)এবং WS_SYSMENU (0x80000)আমার স্টাইল মান থেকে মান, শিরোনাম দণ্ড থেকে সব বোতাম বন্ধ বোতাম সহ সরানো হয়েছে।


ডাব্লুপিএফ- WindowStyleতে একটি গণনা যার মানগুলি উইন্ডোজ এপিআইয়ের ধ্রুবকের সাথে মেলে না; মানকে WindowStyleগণনার উপর চাপিয়ে দেওয়া কার্যকর হবে না। নিশ্চিত হওয়ার জন্য, আমি আইএলপিএসে। নেট উত্স কোডটি পরীক্ষা করে দেখেছি; এনাম মানটি ব্যক্তিগত ফাংশনে উইন্ডোজ এপিআইতে অনুবাদ করা হয় CreateWindowStyle, এবং যদি ফাংশনটি কোনও অজানা WindowStyleমানের মুখোমুখি হয় তবে এটি কেবল প্রযোজ্য WindowStyle.None। (একমাত্র উপায় হবে অভ্যন্তরীণ বৈশিষ্ট্যগুলি ব্যবহার করা _Styleএবং _StyleExপ্রতিবিম্বটি ব্যবহার করা, যার বিরুদ্ধে আমি
দৃ strongly়তার সাথে


-2

প্রয়োজনটি যদি কেবলমাত্র উইন্ডোটি বন্ধ করে দেওয়া থেকে বিরত থাকে তবে এটি একটি সহজ সমাধান।

এক্সএএমএল কোড: IsCloseButtonEnabled="False"

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.