2016-11-29 4 views
0

나는 모든면에서 크기를 조정할 수있는 경계없는 투명 wpf 창 (WindowStyle = None)이 있습니다. ResizeMode = CanResizeWithGrip을 설정하면 현재 크기 조정은 위의 설정으로 만 작동합니다. 이것은 시각적 큐에 좋지만 한 구석에서 크기를 조정할 수 있기 때문에 좋지 않습니다.adorner를 사용하여 모든면에서 창 크기 조정을 구현하는 방법은 무엇입니까?

저는 adorner와 함께이 작업을하고 싶습니다. 따라서 윈도우가 크기 조절 모드 (켜기/끄기 가능) 일 때 시각적 큐를 줄 수도 있습니다. 이것이 가능한가? 그렇다면 어떻게해야할까요?

답변

1

이 질문에 대한 답변이 이미 stackoverflow 어딘지 알려졌습니다. 나는 그것을 지금 실제로 발견 할 수 없다. 그러나 내가 그것을 어떻게 여기에서했는지에 관해 여기에서있다.

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> 

MainWindow를 코드 :

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); 
    } 
} 
+0

내가 다음 adorner이 작업을 수행 할 좋은 방법이없는 것 같아요. 나는 거의 그것을 작동 시켰지 만, 크기 조정은 내가 예상했던 것이 아니었다. 이것은 멋지고 간단한 해결책이다. – Franchesca

관련 문제