web-dev-qa-db-ja.com

タイトルバーにアイコンなしでwpfウィンドウを表示することは可能ですか?

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

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

(同様の質問を検索しようとしましたが、何も見つかりませんでした。)

29
Michael Arnell

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

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

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

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

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

17
Andrej

私はこれが答えられることを知っています、しかし 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));
    }

}
10
Brett Ryan

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

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

  1. 指定されている場合は、アセンブリアイコンを使用します。
  2. アセンブリアイコンが指定されていない場合は、デフォルトのMicrosoftWindowsアイコンを使用します。

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

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

10
Joey

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

enter image description here

7
mehdi