Подтвердить что ты не робот

Можно ли отображать окно wpf без значка в строке заголовка?

Как мы все знаем, если значок для окна wpf undefined, тогда отображается значок по умолчанию. Я хочу отобразить окно без значка в строке заголовка. Я понимаю, что могу использовать пустые изображения, однако это приведет к смещению текста в строке заголовка вправо.

Кто-нибудь знает, как полностью удалить значок?

(Я попытался найти аналогичный вопрос, но ничего не смог найти.)

4b9b3361

Ответ 1

Простой, добавьте этот код в свое окно:

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

Ответ 2

Хотя это не совсем правильное решение, вы можете попробовать одно из следующих вещей:

  • Установка WindowStyle-Property в ToolWindow приведет к исчезновению значка, но строка заголовка (очевидно) будет меньше.

  • Напишите ControlTemplate для всего окна. В зависимости от того, должно ли окно выглядеть как "реальное" окно, при попытке воссоздать стиль по умолчанию в шаблоне будет много усилий.

Ответ 3

Нет, это не представляется возможным. Цитата из документации Свойства значка (выделено мной):

Окно WPF всегда отображает значок. Если один из них не указан установкой значка, WPF выбирает значок для отображения на основе следующих правил:

  • Используйте значок сборки, если он указан.
  • Если значок сборки не указан, используйте значок Microsoft Windows по умолчанию.

Если вы используете значок, чтобы указать значок пользовательского окна, вы можете восстановить значок приложения по умолчанию, установив значок на null.

Итак, очевидно, что для вас лучше всего подходит совершенно прозрачный значок. Или, возможно, взломать все это, используя функции Windows API, чтобы установить соответствующий стиль в окне. Но это может помешать управлению окнами WPF.

Ответ 4

Я знаю, что на это дан ответ, однако блог Дан Ригсби содержит статью, в которой показано, как это сделать, не скрывая коробки с минимальным/максимальным значением.

Я обнаружил, что это расстраивало меня, поскольку я использовал статьи (здесь и здесь, но он сохранял скрывая все кнопки, когда 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));
    }

}

Ответ 5

Вы можете использовать пустой png-образ и преобразовать его в значок и установить его как значок для вашего окна.

enter image description here

Ответ 6

Мое первое предложение было бы не делать этого. В WinForms вы можете использовать типы formborderstyles для создания диалогового окна, у которого нет значка, но только потому, что это стандарт Windows. Только формы с этими конкретными типами границ не должны иметь иконки; это то, что ожидают пользователи.