Можно ли отобразить окно wpf без иконки в строке заголовка? - PullRequest
29 голосов
/ 12 октября 2009

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

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

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

Ответы [ 6 ]

27 голосов
/ 13 октября 2009

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

[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);
}
17 голосов
/ 12 октября 2009

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

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

  2. Создать шаблон ControlTemplate для всего окна. В зависимости от того, должно ли окно выглядеть как «настоящее» окно, потребуется много усилий для воссоздания стиля по умолчанию в шаблоне.

10 голосов
/ 17 мая 2011

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

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

}
10 голосов
/ 12 октября 2009

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

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

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

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

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

7 голосов
/ 09 февраля 2015

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

enter image description here

0 голосов
/ 12 октября 2009

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

...