[英]WPF Thumb drag and move with WindowState.Maximized
I have custom window with WindowState=WindowState.Maximized
with border and thumb inside in the border, it seems that when the WindowState=WindowState.Maximized
I cannot drag and move the custom window to different screen. 我有一个带有
WindowState=WindowState.Maximized
自定义窗口,边框内有边框和拇指,看来当WindowState=WindowState.Maximized
我无法将自定义窗口拖动并移动到其他屏幕。
Xaml: Xaml:
<Window x:Class="WpfApplication3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Height="350"
Width="525"
WindowStyle="None">
<Border Name="headerBorder"
Width="Auto"
Height="50"
VerticalAlignment="Top"
CornerRadius="5,5,0,0"
DockPanel.Dock="Top"
Background="Red"
BorderThickness="1,1,1,1"
BorderBrush="Yellow">
<Grid x:Name="PART_Title">
<Thumb x:Name="headerThumb"
Opacity="0"
Background="{x:Null}"
Foreground="{x:Null}"
DragDelta="headerThumb_DragDelta"/>
</Grid>
</Border>
</Window>
C#: C#:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
WindowState = System.Windows.WindowState.Maximized;
}
private void headerThumb_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
{
Left = Left + e.HorizontalChange;
Top = Top + e.VerticalChange;
}
}
I've also overridden MouseLeftButtonDown
method and using DragMove()
inside but without success. 我也重写了
MouseLeftButtonDown
方法,并在内部使用DragMove()
,但没有成功。 I've also tried to subscribe to thumb's MouseLeftButtonDown
and write there DragMove()
but without success. 我也尝试订阅thumb的
MouseLeftButtonDown
并在其中编写DragMove()
但没有成功。
By default, maximized windows cannot be moved, thus Left
and Top
have no effect. 默认情况下,最大化的窗口无法移动,因此“
Left
和Top
上”无效。 One option would be to register to the Thumb.DragStarted
event and check if the window is maximized. 一种选择是注册到
Thumb.DragStarted
事件,并检查窗口是否最大化。 If yes, you can set WindowState.Normal
and successively update the Left
and Top
properties. 如果是,则可以设置
WindowState.Normal
并依次更新Left
和Top
属性。
In code, this would look somewhat like this: 在代码中,这看起来像这样:
private void Thumb_OnDragStarted(object sender, DragStartedEventArgs e)
{
// If the window is not maximized, do nothing
if (WindowState != WindowState.Maximized)
return;
// Set window state to normal
WindowState = WindowState.Normal;
// Here you have to determine the initial Left and Top values
// for the window that has WindowState normal
// I would use something like the native 'GetCursorPos' (in user32.dll)
// function to get the absolute mouse point on all screens
var point = new Win32Point();
GetCursorPos(ref point);
Left = point - certainXValue;
Top = point - certainYValue;
}
You can learn more about GetCursorPos
here . 您可以在此处了解有关
GetCursorPos
更多信息。
However, I would strongly advise you to use the WindowChrome class that comes with .NET 4.5 and that was also suggested by Max in the comments. 但是,我强烈建议您使用.NET 4.5附带的WindowChrome类,Max在注释中也建议使用该类。 You just have to use the following code and you have the functionality you're asking for:
您只需要使用以下代码,即可获得所需的功能:
<Window x:Class="ThumbMaximizedWindow.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350"
Width="525"
WindowStyle="None"
WindowState="Maximized">
<WindowChrome.WindowChrome>
<WindowChrome />
</WindowChrome.WindowChrome>
</Window>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.