هل من الممكن عرض نافذة WPF بدون أيقونة في شريط العنوان؟

StackOverflow https://stackoverflow.com/questions/1553715

سؤال

كما نعلم جميعًا ، إذا كان الرمز الخاص بنافذة WPF غير محدد ، فسيتم عرض الرمز الافتراضي. أريد عرض نافذة بدون أي رمز في شريط العنوان. أدرك أنه يمكنني استخدام صورة فارغة ، ولكن هذا من شأنه أن يتسبب في تعويض النص في شريط العنوان إلى اليمين.

هل يعرف أي شخص طريقة لإزالة الرمز تمامًا؟

(حاولت البحث عن سؤال مماثل ولكن لم أتمكن من العثور على أي شيء.)

هل كانت مفيدة؟

المحلول

بسيط ، أضف هذا الرمز إلى نافذتك:

[DllImport("user32.dll")]
static extern uint GetWindowLong(IntPtr hWnd, int nIndex);

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

private const int GWL_STYLE = -16;

private const uint WS_SYSMENU = 0x80000;

protected override void OnSourceInitialized(EventArgs e)
{
    IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(this).Handle;
    SetWindowLong(hwnd, GWL_STYLE,
        GetWindowLong(hwnd, GWL_STYLE) & (0xFFFFFFFF ^ WS_SYSMENU));

    base.OnSourceInitialized(e);
}

نصائح أخرى

على الرغم من أنه ليس حلًا مناسبًا تمامًا ، يمكنك تجربة أحد الأشياء التالية:

  1. سيجعل تعيين الممتلك WindowStyle على WindowWindow يختفي الرمز ، لكن شريط العنوان (من الواضح) سيكون أصغر.

  2. اكتب ControlTemplate للنافذة بأكملها. بناءً على ما إذا كان على النافذة أن تبدو وكأنها نافذة "حقيقية" ، سيكون هناك الكثير من الجهد في محاولة إعادة إنشاء النمط الافتراضي في القالب.

لا ، هذا لا يبدو ممكنًا. نقلا من وثائق عقار أيقونة (التأكيد لي):

تعرض نافذة WPF دائمًا أيقونة. عندما لا يتم توفير أحدهم عن طريق تعيين أيقونة ، يختار WPF أيقونة لعرضها بناءً على القواعد التالية:

  1. استخدم أيقونة التجميع ، إذا تم تحديدها.
  2. إذا لم يتم تحديد أيقونة التجميع ، فاستخدم أيقونة Microsoft Windows الافتراضية.

إذا كنت تستخدم أيقونة لتحديد أيقونة نافذة مخصصة ، فيمكنك استعادة أيقونة التطبيق الافتراضية عن طريق تعيين أيقونة null.

لذلك ، يبدو أن أيقونة شفافة تمامًا هي أفضل رهان لك هنا. أو ربما اخترق كل هذا باستخدام وظائف Windows API لتعيين النمط المناسب على النافذة. لكن هذا مايو تتداخل مع إدارة نافذة WPF.

أعلم أن هذا يتم الرد عليه مدونة دان ريجسبي لديه مقال يوضح كيفية القيام بذلك دون إخفاء الصناديق التقليل/زيادة الصناديق.

لقد وجدت أن هذا كان محبطًا لي لأنني كنت أستخدم المقالات (هنا و هنا لكنها استمرت في إخفاء جميع الأزرار عندما تم إخفاء Sysmenu ، لمساعدة لقد قمت بإنشاء هذا المساعد الذي هو كما هو موضح أعلاه في OnSourceInitialized.

public static class WpfWindowHelper {

    [DllImport("user32.dll")]
    public static extern int GetWindowLong(IntPtr hwnd, int index);
    [DllImport("user32.dll")]
    public static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle);
    [DllImport("user32.dll")]
    public static extern bool SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter, int x, int y, int width, int height, uint flags);

    public const int GWL_EXSTYLE = -20;
    public const int WS_EX_DLGMODALFRAME = 0x0001;
    public const int SWP_NOSIZE = 0x0001;
    public const int SWP_NOMOVE = 0x0002;
    public const int SWP_NOZORDER = 0x0004;
    public const int SWP_FRAMECHANGED = 0x0020;
    public const int GWL_STYLE = -16;
    public const int WS_MAXIMIZEBOX = 0x00010000;
    public const int WS_MINIMIZEBOX = 0x00020000;
    public const int WS_SYSMENU = 0x00080000;

    public static void HideSysMenu(this Window w) {
        IntPtr hwnd = new WindowInteropHelper(w).Handle;
        int extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
        SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_DLGMODALFRAME);
        SetWindowPos(hwnd, IntPtr.Zero, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
    }

    public static void HideMinimizeBox(this Window w) {
        IntPtr hwnd = new WindowInteropHelper(w).Handle;
        SetWindowLong(hwnd, GWL_STYLE,
            GetWindowLong(hwnd, GWL_STYLE) & ~(WS_MINIMIZEBOX));
    }

    public static void HideMaximizeBox(this Window w) {
        IntPtr hwnd = new WindowInteropHelper(w).Handle;
        SetWindowLong(hwnd, GWL_STYLE,
            GetWindowLong(hwnd, GWL_STYLE) & ~(WS_MAXIMIZEBOX));
    }

    public static void HideMinimizeAndMaximizeBoxes(this Window w) {
        IntPtr hwnd = new WindowInteropHelper(w).Handle;
        SetWindowLong(hwnd, GWL_STYLE,
            GetWindowLong(hwnd, GWL_STYLE) & ~(WS_MAXIMIZEBOX | WS_MINIMIZEBOX));
    }

}

يمكنك استخدام صورة PNG فارغة وتحويلها إلى أيقونة وتعيينها كأيقونة لنافذتك !!!

enter image description here

اقتراحي الأول سيكون لا تفعل ذلك. في WinForms ، يمكنك استخدام أنواع FormbordersTyles لإنشاء مربع حوار ليس له أيقونة ، ولكن فقط لأن هذا معيار Windows. لا ينبغي أن تحتوي النماذج فقط على أنواع الحدود المحددة إلى أيقونة ؛ هذا ما يتوقعه المستخدمون.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top