Skip to content

Instantly share code, notes, and snippets.

@mberneti
Forked from JoshClose/Example1.xml
Last active August 29, 2015 14:26
Show Gist options
  • Save mberneti/0c11898ba82f97221974 to your computer and use it in GitHub Desktop.
Save mberneti/0c11898ba82f97221974 to your computer and use it in GitHub Desktop.
Making a Custom Window Resizable in WPF
<aero:SystemDropShadowChrome CornerRadius="10" Margin="10">
<Border BorderThickness="1" BorderBrush="Black" Background="White"
Margin="0" CornerRadius="10">
<Grid>
<Border Height="40" Background="#01000000" VerticalAlignment="Top"
CornerRadius="10,10,0,0" MouseLeftButtonDown="DragWindow" />
<Rectangle x:Name="ResizeN" Fill="Yellow" VerticalAlignment="Top"
Height="4" Margin="9,-2,9,0" MouseEnter="DisplayResizeCursor"
MouseLeave="ResetCursor" PreviewMouseLeftButtonDown="Resize" />
<Rectangle x:Name="ResizeE" Fill="Yellow" HorizontalAlignment="Right"
Width="4" Margin="0,9,-2,9" MouseEnter="DisplayResizeCursor"
MouseLeave="ResetCursor" PreviewMouseLeftButtonDown="Resize" />
<Rectangle x:Name="ResizeS" Fill="Yellow" VerticalAlignment="Bottom"
Height="4" Margin="9,0,9,-2" MouseEnter="DisplayResizeCursor"
MouseLeave="ResetCursor" PreviewMouseLeftButtonDown="Resize" />
<Rectangle x:Name="ResizeW" Fill="Yellow" HorizontalAlignment="Left"
Width="4" Margin="-2,9,0,9" MouseEnter="DisplayResizeCursor"
MouseLeave="ResetCursor" PreviewMouseLeftButtonDown="Resize" />
</Grid>
</Border>
</aero:SystemDropShadowChrome>
<Path x:Name="ResizeNW" VerticalAlignment="Top" HorizontalAlignment="Left"
Stroke="Green" StrokeThickness="4" Margin="0" MouseEnter="DisplayResizeCursor"
MouseLeave="ResetCursor" PreviewMouseLeftButtonDown="Resize">
<Path.Data>
<PathGeometry>
<PathGeometry.Figures>
<PathFigureCollection>
<PathFigure StartPoint="0,10">
<PathFigure.Segments>
<PathSegmentCollection>
<QuadraticBezierSegment Point1="0,0" Point2="10,0" />
</PathSegmentCollection>
</PathFigure.Segments>
</PathFigure>
</PathFigureCollection>
</PathGeometry.Figures>
</PathGeometry>
</Path.Data>
</Path>
<Path x:Name="ResizeNE" VerticalAlignment="Top" HorizontalAlignment="Right"
Stroke="Green" StrokeThickness="4" Margin="0,0,-2,0" MouseEnter="DisplayResizeCursor"
MouseLeave="ResetCursor" PreviewMouseLeftButtonDown="Resize">
<Path.Data>
<PathGeometry>
<PathGeometry.Figures>
<PathFigureCollection>
<PathFigure StartPoint="0,0">
<PathFigure.Segments>
<PathSegmentCollection>
<QuadraticBezierSegment Point1="10,0" Point2="10,10" />
</PathSegmentCollection>
</PathFigure.Segments>
</PathFigure>
</PathFigureCollection>
</PathGeometry.Figures>
</PathGeometry>
</Path.Data>
</Path>
<Path x:Name="ResizeSE" VerticalAlignment="Bottom" HorizontalAlignment="Right"
Stroke="Green" StrokeThickness="4" Margin="0,0,-2,-2" MouseEnter="DisplayResizeCursor"
MouseLeave="ResetCursor" PreviewMouseLeftButtonDown="Resize">
<Path.Data>
<PathGeometry>
<PathGeometry.Figures>
<PathFigureCollection>
<PathFigure StartPoint="10,0">
<PathFigure.Segments>
<PathSegmentCollection>
<QuadraticBezierSegment Point1="10,10" Point2="0,10" />
</PathSegmentCollection>
</PathFigure.Segments>
</PathFigure>
</PathFigureCollection>
</PathGeometry.Figures>
</PathGeometry>
</Path.Data>
</Path>
<Path x:Name="ResizeSW" VerticalAlignment="Bottom" HorizontalAlignment="Left"
Stroke="Green" StrokeThickness="4" Margin="0,0,0,-2" MouseEnter="DisplayResizeCursor"
MouseLeave="ResetCursor" PreviewMouseLeftButtonDown="Resize">
<Path.Data>
<PathGeometry>
<PathGeometry.Figures>
<PathFigureCollection>
<PathFigure StartPoint="0,0">
<PathFigure.Segments>
<PathSegmentCollection>
<QuadraticBezierSegment Point1="0,10" Point2="10,10" />
</PathSegmentCollection>
</PathFigure.Segments>
</PathFigure>
</PathFigureCollection>
</PathGeometry.Figures>
</PathGeometry>
</Path.Data>
</Path>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Interop;
using System.Runtime.InteropServices;
namespace ResizableWindow
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
private const int WM_SYSCOMMAND = 0x112;
private HwndSource hwndSource;
private enum ResizeDirection
{
Left = 61441,
Right = 61442,
Top = 61443,
TopLeft = 61444,
TopRight = 61445,
Bottom = 61446,
BottomLeft = 61447,
BottomRight = 61448,
}
[DllImport( "user32.dll", CharSet = CharSet.Auto )]
private static extern IntPtr SendMessage( IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam );
public Window1()
{
SourceInitialized += Window1_SourceInitialized;
InitializeComponent();
}
private void Window1_SourceInitialized( object sender, EventArgs e )
{
hwndSource = PresentationSource.FromVisual( (Visual)sender ) as HwndSource;
}
private void ResizeWindow( ResizeDirection direction )
{
SendMessage( hwndSource.Handle, WM_SYSCOMMAND, (IntPtr)direction, IntPtr.Zero );
}
protected void ResetCursor( object sender, MouseEventArgs e )
{
if( Mouse.LeftButton != MouseButtonState.Pressed )
{
this.Cursor = Cursors.Arrow;
}
}
protected void Resize( object sender, MouseButtonEventArgs e )
{
var clickedShape = sender as Shape;
switch( clickedShape.Name )
{
case "ResizeN":
this.Cursor = Cursors.SizeNS;
ResizeWindow( ResizeDirection.Top );
break;
case "ResizeE":
this.Cursor = Cursors.SizeWE;
ResizeWindow( ResizeDirection.Right );
break;
case "ResizeS":
this.Cursor = Cursors.SizeNS;
ResizeWindow( ResizeDirection.Bottom );
break;
case "ResizeW":
this.Cursor = Cursors.SizeWE;
ResizeWindow( ResizeDirection.Left );
break;
case "ResizeNW":
this.Cursor = Cursors.SizeNWSE;
ResizeWindow( ResizeDirection.TopLeft );
break;
case "ResizeNE":
this.Cursor = Cursors.SizeNESW;
ResizeWindow( ResizeDirection.TopRight );
break;
case "ResizeSE":
this.Cursor = Cursors.SizeNWSE;
ResizeWindow( ResizeDirection.BottomRight );
break;
case "ResizeSW":
this.Cursor = Cursors.SizeNESW;
ResizeWindow( ResizeDirection.BottomLeft );
break;
default:
break;
}
}
protected void DisplayResizeCursor( object sender, MouseEventArgs e )
{
var clickedShape = sender as Shape;
switch( clickedShape.Name )
{
case "ResizeN":
case "ResizeS":
this.Cursor = Cursors.SizeNS;
break;
case "ResizeE":
case "ResizeW":
this.Cursor = Cursors.SizeWE;
break;
case "ResizeNW":
case "ResizeSE":
this.Cursor = Cursors.SizeNWSE;
break;
case "ResizeNE":
case "ResizeSW":
this.Cursor = Cursors.SizeNESW;
break;
default:
break;
}
}
protected void DragWindow( object sender, MouseButtonEventArgs e )
{
DragMove();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment