WPF nie zapewnia możliwości posiadania okna, które umożliwia zmianę rozmiaru, ale nie ma przycisków maksymalizacji ani minimalizacji. Chciałbym móc zrobić takie okno, aby móc zmieniać rozmiar okien dialogowych.
Wiem, że rozwiązanie będzie oznaczało użycie pinvoke, ale nie jestem pewien, do czego i jak zadzwonić. Wyszukiwanie pinvoke.net nie przyniosło niczego, co wyskoczyło na mnie jako to, czego potrzebowałem, głównie jestem pewien, ponieważ Windows Forms zapewnia właściwości CanMinimize
i CanMaximize
w swoich oknach.
Czy ktoś może wskazać mi lub podać kod (preferowany w C #), jak to zrobić?
źródło
Jednym ze sposobów jest ustawienie
ResizeMode="NoResize"
. Będzie się tak zachowywać.Mam nadzieję, że to pomoże!
źródło
resizable window
WPF?” gdy usuwa się „resizable” Aspekt z gotowego produktu. To tak, jakby pomóc komuś, kto chce pomalować swój samochód na czerwono, a przy okazji zdjąć silnik.Nie wiem, czy to działa w przypadku Twojego wymagania. wizualnie .. to jest
<Window x:Class="DataBinding.MyWindow" ...Title="MyWindow" Height="300" Width="300" WindowStyle="ToolWindow" ResizeMode="CanResizeWithGrip">
źródło
MaxWidth
i / lubMaxHeight
okno.Jeśli ktoś używa okna Devexpress (DXWindow) zaakceptowana odpowiedź nie działa. Jedno brzydkie podejście to
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; } }
źródło
Oto rozwiązanie, którego używam. Zwróć uwagę, że przycisk maksymalizacji jest nadal wyświetlany.
Narzut:
<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">
Kod za:
// Disable maximizing this window private void Window_StateChanged(object sender, EventArgs e) { if (this.WindowState == WindowState.Maximized) this.WindowState = WindowState.Normal; }
źródło
Możesz ustawić ResizeMode = "NoResize" okna, jeśli chcesz usunąć przycisk Minimalizuj i Maksymalizuj
źródło
Ten wariant rozwiązania zaproponowany przez @MattHamilton może (i musi) zostać wywołany w konstruktorze Window. Sztuczka polega na zasubskrybowaniu delegata do
SourceInitialized
zdarzenia w ramach metody rozszerzenia.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); }; }
źródło