我正在使用自定义镶边创建一个WPF窗口,因此我设置ResizeMode="NoResize"
和WindowStyle="None"
来实现我自己的镶边。但是,在最大化无边框窗口时会出现问题:它需要整个屏幕。
我找到了以下技巧来解决部分问题: http://chiafong6799.wordpress.com/2009/02/05/maximizing-a-borderlessno-caption-window/
这成功地限制了窗口大小以防止覆盖任务栏。但是,如果用户的任务栏位于左侧或顶部,则此操作无效,因为窗口位于0,0位置。
有没有办法更准确地检索可用区域,或查询用户任务栏的位置,以便我可以相应地定位最大化窗口?
答案 0 :(得分:5)
我快速玩了一下,在设置Windows
无边界格式时,似乎忽略了设置Left
Top
和WindowState.Maximized
属性。
一种解决方法是忽略WindowState
函数并创建自己的Maximize
/ Restore
函数
粗略的例子。
public partial class MainWindow : Window
{
private Rect _restoreLocation;
public MainWindow()
{
InitializeComponent();
}
private void MaximizeWindow()
{
_restoreLocation = new Rect { Width = Width, Height = Height, X = Left, Y = Top };
System.Windows.Forms.Screen currentScreen;
currentScreen = System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position);
Height = currentScreen.WorkingArea.Height;
Width = currentScreen.WorkingArea.Width;
Left = currentScreen.WorkingArea.X;
Top = currentScreen.WorkingArea.Y;
}
private void Restore()
{
Height = _restoreLocation.Height;
Width = _restoreLocation.Width;
Left = _restoreLocation.X;
Top = _restoreLocation.Y;
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
MaximizeWindow();
}
private void Button_Click_2(object sender, RoutedEventArgs e)
{
Restore();
}
protected override void OnMouseMove(MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
DragMove();
}
base.OnMouseMove(e);
}
}
的Xaml:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="74.608" Width="171.708" ResizeMode="NoResize" WindowStyle="None">
<Grid>
<Button Content="Max" HorizontalAlignment="Left" Margin="0,29,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/>
<Button Content="Restore" HorizontalAlignment="Left" Margin="80,29,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_2"/>
</Grid>
</Window>
显然,您需要清理此代码,但它似乎适用于Taskbar
所在的位置,但您可能需要添加一些逻辑才能获得正确的Left
,{{1}如果用户字体DPI大于100%
答案 1 :(得分:2)
另一种方法是处理WM_GETMINMAXINFO
Win32消息。代码here显示了如何执行此操作。
请注意,我会做一些不同的事情,例如在WindowProc中返回IntPtr.Zero
而不是(System.IntPtr)0并使MONITOR_DEFAULTTONEAREST
成为常量。但这只是编码风格的变化,并不影响净结果。
另外,请务必注意在WindowProc
事件期间SourceInitialized
而不是OnApplyTemplate
的{{1}}被更新的更新。那是更好的地方。如果您正在实现从Window派生的类,那么另一个选项是覆盖OnSourceInitialized
以挂钩WindowProc
而不是附加到事件。这就是我通常做的事情。