29

ご存知のように、wpf ウィンドウのアイコンが定義されていない場合、デフォルトのアイコンが表示されます。タイトルバーにアイコンがないウィンドウを表示したい。空白の画像を使用できることはわかっていますが、これにより、タイトル バーのテキストが右にずれてしまいます。

アイコンを完全に削除する方法を知っている人はいますか?

(似たような質問を探してみましたが見つかりませんでした。)

4

7 に答える 7

31

簡単です。次のコードをウィンドウに追加します。

[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);
}
于 2009-10-13T10:58:38.607 に答える
17

正確には適切な解決策ではありませんが、次のいずれかを試すことができます。

  1. WindowStyle-Property を ToolWindow に設定すると、アイコンが非表示になりますが、タイトル バーは (明らかに) 小さくなります。

  2. Window 全体の ControlTemplate を記述します。ウィンドウが「実際の」ウィンドウのように見える必要があるかどうかによっては、テンプレートでデフォルトのスタイルを再作成しようとする努力が必要になります。

于 2009-10-12T10:15:19.747 に答える
11

私はこれが答えられていることを知っていますが、Dan Rigsbyのブログには、最小化/最大化ボックスを非表示にせずにこれを行う方法を示す記事があります。

記事を使用しているときに、これがイライラしていることに気付きました(ここここですが、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));
    }

}
于 2011-05-16T22:37:43.360 に答える
10

いいえ、これは不可能のようです。Icon プロパティのドキュメントからの引用(強調鉱山):

WPF ウィンドウには常にアイコンが表示されます。Icon を設定して提供されない場合、WPF は次の規則に基づいて表示するアイコンを選択します。

  1. 指定されている場合は、アセンブリ アイコンを使用します。
  2. アセンブリ アイコンが指定されていない場合は、既定の Microsoft Windows アイコンを使用します。

Icon を使用してカスタム ウィンドウ アイコンを指定する場合、Icon を に設定すると、デフォルトのアプリケーション アイコンを復元できますnull

したがって、ここでは完全に透明なアイコンが最善の策のようです。または、Windows API 関数を使用してウィンドウに適切なスタイルを設定することで、これらすべてをハックすることもできます。ただし、これWPF のウィンドウ管理に干渉する可能性があります。

于 2009-10-12T10:09:20.823 に答える
6

空のpng画像を使用してアイコンに変換し、ウィンドウのアイコンとして設定できます!!!

ここに画像の説明を入力

于 2015-02-09T08:32:51.320 に答える
-2

私の最初の提案は、やらないことです。WinForms では、formborderstyles のタイプを使用して、アイコンのないダイアログ ボックスを作成できますが、これは Windows 標準であるためです。これらの特定の境界線タイプを持つフォームのみ、アイコンを持たないようにする必要があります。それがユーザーの期待です。

于 2009-10-12T10:10:29.623 に答える