기능 크기 조정을 그대로 유지하면서 WPF 창의 최대화 버튼 사용 안 함
옵션이 네 . 즉, WPF의 크기 조정 모드는 다음과 같습니다.NoResize
,CanMinimize
,CanResize
그리고.CanResizeWithGrip
유감스럽게도 크기 조정을 사용할 수 있는 옵션은 창을 최대화할 수도 있고 그렇지 않은 옵션은 제게 쓸모가 없습니다.
크기 조정 기능을 유지하면서 최대화 버튼을 비활성화하는 옵션이 있습니까?
고객의 요구를 충족시키지 못하는 솔루션을 선호합니다.WinAPI
물건들
최대화만 사용 안 함:
ResizeMode="CanMinimize"
WPF에는 WinForms와 같이 Maximize(최대화) 버튼만 비활성화할 수 있는 기본 기능이 없습니다.WinAPI 호출에 의존해야 합니다.무섭지 않아요.
[DllImport("user32.dll")]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
private const int GWL_STYLE = -16;
private const int WS_MAXIMIZEBOX = 0x10000;
private void Window_SourceInitialized(object sender, EventArgs e)
{
var hwnd = new WindowInteropHelper((Window)sender).Handle;
var value = GetWindowLong(hwnd, GWL_STYLE);
SetWindowLong(hwnd, GWL_STYLE, (int)(value & ~WS_MAXIMIZEBOX));
}
설정하는 경우
WindowStyle="ToolWindow"
창의 속성에서 위쪽에 최소화 또는 최대화 단추가 없는 크기 조정 가능한 창을 제공합니다.사각형으로 보이고 닫기 버튼도 사각형이지만, 최소한 최소화와 최대화는 없습니다!
P/Invoke 메서드
관리되는(.)에서 관리되지 않는 코드(이 경우 C++)를 가장 쉽게 호출할 수 있는 방법NET) 코드는 플랫폼 호출 서비스(P/Invoke라고도 함)를 사용하는 것입니다.컴파일러에 관리되지 않는 함수의 선언을 제공하고 다른 관리되는 메서드를 호출하는 것과 마찬가지로 호출합니다.지정된 창의 특성을 변경하는 데 사용할 수 있는 관리되지 않는 SetWindowLong 메서드가 있습니다.P/Invoke를 사용하여 WPF 창 클래스에서 이 메서드를 호출할 수 있으려면 다음 선언을 창 클래스에 추가하기만 하면 됩니다.
[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
DllImport 특성은 메서드를 포함하는 DLL의 이름을 지정하며 extern 키워드는 C# 컴파일러에게 메서드가 외부에서 구현되며 응용 프로그램을 컴파일할 때 메서드에 대한 구현이나 메서드 본문을 찾을 수 없음을 알려줍니다.SetWindowLong 메서드에 전달될 첫 번째 인수는 언급된 단추를 비활성화할 창의 핸들입니다.관리되는 WindowInterop의 인스턴스를 생성하여 WPF 창에 대한 핸들을 얻을 수 있습니다.창의 SourceInitialized 이벤트에 대한 이벤트 핸들러의 Helper 클래스 및 Handle 속성에 액세스합니다.이 이벤트는 핸들이 완전히 만들어지면 발생합니다.SetWindowLong 메서드의 두 번째 인수는 설정할 창의 속성 또는 값을 상수 정수 값으로 지정합니다.창 스타일을 변경하려면 GWL_STYLE(= -16) 상수를 두 번째 인수로 메서드에 전달해야 합니다.
private const int GWL_STYLE = -16;
마지막으로 세 번째 인수는 대체 값을 지정합니다.여기서 사용할 수 있는 상수 집합은 다음과 같습니다.
private const int WS_MAXIMIZEBOX = 0x10000; //maximize button
private const int WS_MINIMIZEBOX = 0x20000; //minimize button
그러나 두 번째 인수(이 경우 창 스타일)에 의해 지정된 "속성"의 전체 값을 지정하는 DWORD를 전달해야 하므로 이러한 상수를 세 번째 인수로 메서드에 전달할 수 없습니다.특정 속성의 현재 값(이 경우 GWL_STYLE)을 검색하는 다른 GetWindowLong 메서드가 있습니다. 그런 다음 비트 연산자를 사용하여 SetWindowLong 메서드에 전달할 세 번째 매개 변수의 올바른 값을 가져올 수 있습니다.다음은 WPF에서 창의 최소화 단추를 비활성화하는 방법에 대한 전체 코드 샘플입니다.
public partial class MainWindow : Window
{
[DllImport("user32.dll")]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
private const int GWL_STYLE = -16;
private const int WS_MAXIMIZEBOX = 0x10000; //maximize button
private const int WS_MINIMIZEBOX = 0x20000; //minimize button
public MainWindow() {
InitializeComponent();
this.SourceInitialized += MainWindow_SourceInitialized;
}
private IntPtr _windowHandle;
private void MainWindow_SourceInitialized(object sender, EventArgs e) {
_windowHandle = new WindowInteropHelper(this).Handle;
//disable minimize button
DisableMinimizeButton();
}
protected void DisableMinimizeButton() {
if (_windowHandle == IntPtr.Zero)
throw new InvalidOperationException("The window has not yet been completely initialized");
SetWindowLong(_windowHandle, GWL_STYLE, GetWindowLong(_windowHandle, GWL_STYLE) & ~WS_MAXIMIZEBOX);
}
}
최소화 버튼을 비활성화하는 것은 WS_MAXIMIZEBOX 상수를 WS_MIMIZEBOX로 바꾸기만 하면 됩니다.
또 다른 선택은 그것을 잡는 것입니다.StateChanged
창이 최대화될 때 발생하는 이벤트입니다.그런 다음 간단히 설정합니다.WindowState
"정상"으로.
그러나 이 경우 최대화 상자가 숨겨지지 않습니다.
private void Window_StateChanged(object sender, EventArgs e)
{
if (WindowState == WindowState.Maximized)
{
WindowState = WindowState.Normal;
}
}
최소화, 최대화 및 닫기 단추를 제거하고 필요한 단추를 직접 만드는 WindowStyle을 없음으로 설정하여 사용자 정의 창을 만들 수 있습니다.이에 대한 좋은 예입니다.
http://www.codeproject.com/Articles/131515/WPF-Custom-Chrome-Library
추가 작업을 제공하지만 WinAPI를 사용하고 싶지 않다면 선택 사항입니다.
언급URL : https://stackoverflow.com/questions/18707782/disable-maximize-button-of-wpf-window-keeping-resizing-feature-intact
'source' 카테고리의 다른 글
WPF/C# 및 Qt/C++ 중에서 선택 (0) | 2023.05.22 |
---|---|
VBA에서 워크북을 열고 Workbook_Open() 코드를 비활성화하시겠습니까? (0) | 2023.05.22 |
Excel의 수식에서 셀 번호가 증가하지 않도록 방지 (0) | 2023.05.22 |
TestFlight에서 규정 준수 상태 (0) | 2023.05.22 |
Python 2 및 Python 3의 정수 분할 (0) | 2023.05.22 |