WPF ne fournit pas la possibilité d'avoir une fenêtre qui autorise le redimensionnement mais n'a pas de boutons maximiser ou réduire. Je voudrais pouvoir faire une telle fenêtre afin que je puisse avoir des boîtes de dialogue redimensionnables.
Je suis conscient que la solution impliquera l'utilisation de pinvoke mais je ne sais pas comment appeler ni comment. Une recherche sur pinvoke.net n’a révélé aucun élément qui m’avait semblé être nécessaire, surtout parce que Windows Forms fournit les propriétés CanMinimize
et CanMaximize
sur ses fenêtres.
Quelqu'un pourrait-il me diriger vers ou fournir un code (C # préféré) sur la façon de procéder?
J'ai volé du code trouvé sur les forums MSDN et créé une méthode d'extension sur la classe Window, comme ceci:
internal static class WindowExtensions
{
// from winuser.h
private const int GWL_STYLE = -16,
WS_MAXIMIZEBOX = 0x10000,
WS_MINIMIZEBOX = 0x20000;
[DllImport("user32.dll")]
extern private static int GetWindowLong(IntPtr hwnd, int index);
[DllImport("user32.dll")]
extern private static int SetWindowLong(IntPtr hwnd, int index, int value);
internal static void HideMinimizeAndMaximizeButtons(this Window window)
{
IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(window).Handle;
var currentStyle = GetWindowLong(hwnd, GWL_STYLE);
SetWindowLong(hwnd, GWL_STYLE, (currentStyle & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX));
}
}
La seule autre chose à retenir est que, pour une raison quelconque, cela ne fonctionne pas à partir du constructeur de la fenêtre. J'ai contourné cela en glissant ceci dans le constructeur:
this.SourceInitialized += (x, y) =>
{
this.HideMinimizeAndMaximizeButtons();
};
J'espère que cela t'aides!
Une solution consiste à définir votre ResizeMode="NoResize"
. Il se comportera comme ceci .
J'espère que ça aide!
Si quelqu'un utilise la fenêtre Devexpress (DXWindow), la réponse acceptée ne fonctionne pas. Une approche laide est
public partial class MyAwesomeWindow : DXWindow
{
public MyAwesomeWIndow()
{
Loaded += OnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
{
// hides maximize button
Button button = (Button)DevExpress.Xpf.Core.Native.LayoutHelper.FindElementByName(this, DXWindow.ButtonParts.PART_Maximize.ToString());
button.IsHitTestVisible = false;
button.Opacity = 0;
// hides minimize button
button = (Button)DevExpress.Xpf.Core.Native.LayoutHelper.FindElementByName(this, DXWindow.ButtonParts.PART_Minimize.ToString());
button.IsHitTestVisible = false;
button.Opacity = 0;
// hides close button
button = (Button)DevExpress.Xpf.Core.Native.LayoutHelper.FindElementByName(this, DXWindow.ButtonParts.PART_CloseButton.ToString());
button.IsHitTestVisible = false;
button.Opacity = 0;
}
}
Voici une solution que j'utilise. Notez que le bouton Agrandir est toujours affiché.
Balisage:
<Window x:Class="Example"
xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
Title="Example"
StateChanged="Window_StateChanged">
Code derrière:
// Disable maximizing this window
private void Window_StateChanged(object sender, EventArgs e)
{
if (this.WindowState == WindowState.Maximized)
this.WindowState = WindowState.Normal;
}
Vous pouvez définir le ResizeMode = "NoResize" de la fenêtre si vous souhaitez supprimer les boutons Réduire et Agrandir.
Cette variante de la solution proposée par @MattHamilton peut (et doit) être appelée dans le constructeur de Window. L'astuce consiste à abonner un délégué à l'événement SourceInitialized
au sein de la méthode d'extension.
private const int GWL_STYLE = -16, WS_MAXIMIZEBOX = 0x10000, WS_MINIMIZEBOX = 0x20000;
[DllImport("user32.dll")]
extern private static int GetWindowLong(IntPtr hwnd, int index);
[DllImport("user32.dll")]
extern private static int SetWindowLong(IntPtr hwnd, int index, int value);
/// <summary>
/// Hides the Minimize and Maximize buttons in a Window. Must be called in the constructor.
/// </summary>
/// <param name="window">The Window whose Minimize/Maximize buttons will be hidden.</param>
public static void HideMinimizeAndMaximizeButtons(this Window window)
{
window.SourceInitialized += (s, e) => {
IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(window).Handle;
int currentStyle = GetWindowLong(hwnd, GWL_STYLE);
SetWindowLong(hwnd, GWL_STYLE, currentStyle & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX);
};
}