Как осуществить изменение размеров окна со всех сторон, используя рекламный элемент?

У меня есть прозрачное окно wpf без полей (WindowStyle=None), которое я хотел бы изменить со всех сторон. В настоящее время изменение размера работает только с вышеуказанными настройками, если я установил ResizeMode=CanResizeWithGrip. Это хорошо для визуальной подсказки, но не так хорошо, потому что вы можете изменить размер только из одного угла.

Я хотел бы сделать это с рекламодателем, поэтому я также могу дать визуальную подсказку, когда окно находится в режиме изменения размера (который можно включать и выключать). Это возможно? Если так, как бы я пошел по этому поводу?

1 ответ

Решение

На этот вопрос уже был дан ответ где-то на stackru. Я не могу найти это сейчас, но вот как я это сделал.

MainWindow:

<Window x:Class="Solution.Views.Main.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" MinWidth="1000" MinHeight="500" WindowStyle="None" AllowsTransparency="False" BorderThickness="0" ResizeMode="NoResize">

   <Window.TaskbarItemInfo>
     <TaskbarItemInfo />
   </Window.TaskbarItemInfo>

  <Grid>

    <Border MouseLeftButtonDown="WindowResizeEast" MouseEnter="BorderVertical_OnMouseEnter" MouseLeave="BorderAll_OnMouseLeave" VerticalAlignment="Stretch" HorizontalAlignment="Right" Width="1" Background="Black"/>
    <Border MouseLeftButtonDown="WindowResizeWest" MouseEnter="BorderVertical_OnMouseEnter" MouseLeave="BorderAll_OnMouseLeave"  VerticalAlignment="Stretch" HorizontalAlignment="Left" Width="1" Background="Black"/>
    <Border MouseLeftButtonDown="WindowResizeNorth" MouseEnter="BorderHorizontal_OnMouseEnter" MouseLeave="BorderAll_OnMouseLeave"  VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="1" Background="Black"/>
    <Border MouseLeftButtonDown="WindowResizeSouth" MouseEnter="BorderHorizontal_OnMouseEnter" MouseLeave="BorderAll_OnMouseLeave"  VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Height="1" Background="Black"/>
    <Border VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="20" Height="20" MouseEnter="BorderSouthEast_OnMouseEnter" MouseLeave="BorderAll_OnMouseLeave" MouseLeftButtonDown="UIElement_OnMouseLeftButtonDown">
        <Grid>
            <Path Stroke="Gray" StrokeThickness="1" Data=" M 5 20 L 20 5 M 10 20 L 20 10 M 15 20 L 20 15"/>
        </Grid>
    </Border>
  </Grid>
</Window>

Код основного окна:

using System;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;
using PrmWpf.Services;

 public partial class MainWindow
{
    public MainWindow()
    {
        InitializeComponent();
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern IntPtr SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

    [DllImportAttribute("user32.dll")]
    public static extern bool ReleaseCapture();

    private void WindowResizeNorth(object sender, MouseButtonEventArgs e) //PreviewMousLeftButtonDown
    {
        var hwndSource = PresentationSource.FromVisual((Visual)sender) as HwndSource;
        SendMessage(hwndSource.Handle, 0x112, (IntPtr)ResizeDirection.Top, IntPtr.Zero);
    }

    private void WindowResizeSouth(object sender, MouseButtonEventArgs e) //PreviewMousLeftButtonDown
    {
        var hwndSource = PresentationSource.FromVisual((Visual)sender) as HwndSource;
        SendMessage(hwndSource.Handle, 0x112, (IntPtr)ResizeDirection.Bottom, IntPtr.Zero);
    }

    private void WindowResizeWest(object sender, MouseButtonEventArgs e) //PreviewMousLeftButtonDown
    {
        var hwndSource = PresentationSource.FromVisual((Visual)sender) as HwndSource;
        SendMessage(hwndSource.Handle, 0x112, (IntPtr)ResizeDirection.Left, IntPtr.Zero);
    }

    private void WindowResizeEast(object sender, MouseButtonEventArgs e) //PreviewMousLeftButtonDown
    {
        var hwndSource = PresentationSource.FromVisual((Visual)sender) as HwndSource;
        SendMessage(hwndSource.Handle, 0x112, (IntPtr)ResizeDirection.Right, IntPtr.Zero);
    }

    private enum ResizeDirection { Left = 61441, Right = 61442, Top = 61443, Bottom = 61446, BottomRight = 61448, }

    private void BorderVertical_OnMouseEnter(object sender, MouseEventArgs e)
    {
        Mouse.OverrideCursor = Cursors.SizeWE;
    }

    private void BorderHorizontal_OnMouseEnter(object sender, MouseEventArgs e)
    {
        Mouse.OverrideCursor = Cursors.SizeNS;
    }

    private void BorderAll_OnMouseLeave(object sender, MouseEventArgs e)
    {
        Mouse.OverrideCursor = Cursors.Arrow;
    }

    private void BorderSouthEast_OnMouseEnter(object sender, MouseEventArgs e)
    {
        Mouse.OverrideCursor = Cursors.SizeNWSE;
    }

    private void UIElement_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        var hwndSource = PresentationSource.FromVisual((Visual)sender) as HwndSource;
        SendMessage(hwndSource.Handle, 0x112, (IntPtr)ResizeDirection.BottomRight, IntPtr.Zero);
    }
}
Другие вопросы по тегам