Created
November 15, 2011 17:15
-
-
Save JoshClose/1367657 to your computer and use it in GitHub Desktop.
Making a Custom Window Resizable in WPF
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
Hi,
Could I use these codes in my commercial software for free