我们都知道,如果一个WPF窗口中的图标是不确定的,则显示的默认图标。 我想没有在标题栏中的任何图标以显示一个窗口。 我意识到,我可以用一个空白图像,但是这将导致在标题栏中的文本将向右偏移。
有谁知道的一种方式完全删除的图标?
(我试图寻找一个类似的问题,但找不到任何东西。)
我们都知道,如果一个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);
}
虽然不完全是一个妥善的解决办法,你可以尝试以下情况之一:
在WindowStyle-属性设置为工具窗口将会使图标消失,但标题栏(显然)将较小。
写整个窗口中的ControlTemplate。 根据是否有窗口有看起来像一个“真实”的窗口,也一定会觉得很精力试图重新在模板中的默认样式。
No, this doesn't seem to be possible. Quoting from the documentation of the Icon property (emphasis mine):
A WPF window always displays an icon. When one is not provided by setting Icon, WPF chooses an icon to display based on the following rules:
- Use the assembly icon, if specified.
- If the assembly icon is not specified, use the default Microsoft Windows icon.
If you use Icon to specify a custom window icon, you can restore the default application icon by setting Icon to
null
.
So, apparently a completely transparent icon seems to be your best bet here. Or perhaps hack around all this by using Windows API functions to set the appropriate style on the window. But this may interfere with WPF's window management.
我知道这是回答,但是丹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));
}
}
您可以使用空的PNG图像并将其转换为图标,将其设置为你的窗口图标!
我的第一个建议是不要做它 。 在的WinForms,您可以使用类型formborderstyles来创建一个没有图标一个对话框,但只是因为这是一个Windows标准。 只有那些特定的边框类型构成应该没有图标; 这就是用户的期望。