我想取消自然最小化行为并改为改变WPF表单大小。
我有一个Window_StateChanged的解决方案,但它看起来不那么好 - 窗口首先被最小化然后跳回并进行大小改变。有没有办法实现这个目标?我用Google搜索了Window_StateChanging但是无法解决这个问题,某些我不想使用的外部库。
这就是我所拥有的:
private void Window_StateChanged(object sender, EventArgs e)
{
switch (this.WindowState)
{
case WindowState.Minimized:
{
WindowState = System.Windows.WindowState.Normal;
this.Width = 500;
this.Height = 800;
break;
}
}
}
谢谢,
EP
答案 0 :(得分:9)
你需要在表单触发Window_StateChanged
之前截取最小化命令,以避免你看到的最小化/恢复舞蹈。我认为最简单的方法是让你的表单监听Windows消息,当收到最小化命令时,取消它并调整表单大小。
在表单构造函数中注册SourceInitialized
事件:
this.SourceInitialized += new EventHandler(OnSourceInitialized);
将这两个处理程序添加到表单中:
private void OnSourceInitialized(object sender, EventArgs e) {
HwndSource source = (HwndSource)PresentationSource.FromVisual(this);
source.AddHook(new HwndSourceHook(HandleMessages));
}
private IntPtr HandleMessages(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) {
// 0x0112 == WM_SYSCOMMAND, 'Window' command message.
// 0xF020 == SC_MINIMIZE, command to minimize the window.
if (msg == 0x0112 && ((int)wParam & 0xFFF0) == 0xF020) {
// Cancel the minimize.
handled = true;
// Resize the form.
this.Width = 500;
this.Height = 500;
}
return IntPtr.Zero;
}
我怀疑这是你希望避免的方法,但归结为我所展示的代码并不太难实现。
代码基于this SO question。
答案 1 :(得分:0)
尝试这个简单的解决方案:
public partial class MainWindow : Window
{
private int SC_MINIMIZE = 0xf020;
private int SYSCOMMAND = 0x0112;
public MainWindow()
{
InitializeComponent();
SourceInitialized += (sender, e) =>
{
HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
source.AddHook(WndProc);
};
}
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
// process minimize button
if (msg == SYSCOMMAND && SC_MINIMIZE == wParam.ToInt32())
{
//Minimize clicked
handled = true;
}
return IntPtr.Zero;
}
}