WPF自定义标题栏——窗口移动和按钮状态转换[转]
其实这一部分的资料网上很多,也看了很多的例子,不过大部分都不是自己想要的结果,所以就综合网上的资料整理了一下,放在这里吧,虽然现在放弃WPF了,不过以后还是想接着学一下,先放着吧就。
标题栏的移动:
其实这部分还是很简单的,只需加一个
<Grid Name="titleBar" VerticalAlignment="Top" Height="40" Background="#0F4378" MouseMove="TitleBar_MouseMove">
</Grid>
</Grid>
鼠标移动时间响应:
public void TitleBar_MouseMove(object sender, MouseEventArgs e)
{
if(e.LeftButton == MouseButtonState.Pressed)
this.DragMove();
}
{
if(e.LeftButton == MouseButtonState.Pressed)
this.DragMove();
}
窗口按钮状态转换:
这里指的是普通,鼠标浮上,鼠标按下三种状态在同一张图片上,通过图片的偏移来实现转换。以最小化按钮为例:
<Button Name="minBtn" Width="34" FocusVisualStyle="{x:Null}" Click="MinBtn_Click">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="Background">
<Setter.Value>
<DrawingBrush Stretch="Fill" TileMode="Tile" Viewport="0,0,3,1" Viewbox="0,0,1,1">
<DrawingBrush.Drawing>
<ImageDrawing ImageSource="res\btn_min.png" Rect="0,0,1,1"/>
</DrawingBrush.Drawing>
</DrawingBrush>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid Background="{TemplateBinding Background}">
<ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background">
<Setter.Value>
<DrawingBrush Stretch="Fill" TileMode="Tile" Viewport="2,0,3,1" Viewbox="0,0,1,1">
<DrawingBrush.Drawing>
<ImageDrawing ImageSource="res\btn_min.png" Rect="0,0,1,1"/>
</DrawingBrush.Drawing>
</DrawingBrush>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background">
<Setter.Value>
<DrawingBrush Stretch="Fill" TileMode="Tile" Viewport="1,0,3,1" Viewbox="0,0,1,1">
<DrawingBrush.Drawing>
<ImageDrawing ImageSource="res\btn_min.png" Rect="0,0,1,1"/>
</DrawingBrush.Drawing>
</DrawingBrush>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="Background">
<Setter.Value>
<DrawingBrush Stretch="Fill" TileMode="Tile" Viewport="0,0,3,1" Viewbox="0,0,1,1">
<DrawingBrush.Drawing>
<ImageDrawing ImageSource="res\btn_min.png" Rect="0,0,1,1"/>
</DrawingBrush.Drawing>
</DrawingBrush>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid Background="{TemplateBinding Background}">
<ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background">
<Setter.Value>
<DrawingBrush Stretch="Fill" TileMode="Tile" Viewport="2,0,3,1" Viewbox="0,0,1,1">
<DrawingBrush.Drawing>
<ImageDrawing ImageSource="res\btn_min.png" Rect="0,0,1,1"/>
</DrawingBrush.Drawing>
</DrawingBrush>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background">
<Setter.Value>
<DrawingBrush Stretch="Fill" TileMode="Tile" Viewport="1,0,3,1" Viewbox="0,0,1,1">
<DrawingBrush.Drawing>
<ImageDrawing ImageSource="res\btn_min.png" Rect="0,0,1,1"/>
</DrawingBrush.Drawing>
</DrawingBrush>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
同样实现窗口的最小化和关闭也比较容易:
private void MinBtn_Click(object sender, RoutedEventArgs e)
{
this.WindowState = WindowState.Minimized;
}
private void CloseBtn_Click(object sender, RoutedEventArgs e)
{
mainWindow.Close();
}
{
this.WindowState = WindowState.Minimized;
}
private void CloseBtn_Click(object sender, RoutedEventArgs e)
{
mainWindow.Close();
}
本文来自eilotyan的博客,原文地址:http://blog.csdn.net/eilotyan/archive/2011/06/08/6532917.aspx