В WPF при перетаскивании настраиваемой строки заголовка в окно без границ окно восстанавливается, как это реализовать?
Я настроил окно без границ, которое no style
а также no border
а также AllowsTransparency="True"
и в верхней части этого окна вместо встроенной строки заголовка находится функциональный прямоугольник.
Как правило, перетащите строку заголовка развернутого окна, после чего окно будет восстановлено, но в моем настраиваемом окне без границ я не представляю, как его реализовать. Кто может мне помочь?
Это простой код:
<Window x:Class="WpfApplication24.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"
AllowsTransparency="True">
<DockPanel LastChildFill="False">
<Rectangle DockPanel.Dock="Top" x:Name="DragRectangle" Height="30" Fill="#FF123456" MouseLeftButtonDown="DragRectangle_MouseLeftButtonDown"/>
<Button x:Name="ToMaxButton" Content="ToMaxButton" Click="ToMaxButton_Click" Height="30" Margin="5"/>
<Button x:Name="ToNormalButton" Content="ToNormalButton" Click="ToNormalButton_Click" Height="30" Margin="5"/>
<Button x:Name="CloseButton" Content="CloseButton" Click="CloseButton_Click" Height="30" Margin="5"/>
</DockPanel>
</Window>
а также
namespace WpfApplication24
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void DragRectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
this.DragMove();
}
private void ToMaxButton_Click(object sender, RoutedEventArgs e)
{
this.WindowState = System.Windows.WindowState.Maximized;
}
private void CloseButton_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void ToNormalButton_Click(object sender, RoutedEventArgs e)
{
this.WindowState = System.Windows.WindowState.Normal;
}
}
}
Отредактировано:
Перетаскивая исходное окно, мы обнаружим, что нам нужно перетащить небольшое расстояние, а затем изменить window.state, тогда положение окна будет таким, что координата курсора будет почти такой же.
1 ответ
Решение
Вы можете добавить обработчик MouseUp и MouseMove
private bool _isMouseDown = false;
private void DragRectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
_isMouseDown = true;
this.DragMove();
}
private void DragRectangle_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
_isMouseDown = false;
}
private void DragRectangle_MouseMove(object sender, MouseEventArgs e)
{
// if we are dragging and Maximized, retore window
if (_isMouseDown && this.WindowState == System.Windows.WindowState.Maximized)
{
_isMouseDown = false;
this.WindowState = System.Windows.WindowState.Normal;
}
}