WPF窗体动态效果

在浏览网页的时候,发现现在很多网页都采用这种效果。看起来很炫。

效果如下:

已经实现很久了,一直没写出来。今天突然想到,写出来分享一下

原理比较简单,就是在Window里面放一个MediaElement控件,播放视频就行

1、首先需要定义Window样式

如果使用 WindowStyle="None"属性再手动实现窗体效果,那窗体是没有阴影、标题栏,也没有动画效果,所以需要使用WindowChrome类来自定义窗体

WindowChrome类介绍https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.shell.windowchrome?redirectedfrom=MSDN&view=netframework-4.8

一、新建一个WPF工程,命名为DynamicWindow

二、添加资源字典WindowStyle.xaml,用于自定义窗体样式

输入以下代码

  1 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  2                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  3                     xmlns:local="clr-namespace:DynamicWindow">
  4     <Style x:Key="CaptionNormalButtonStyle" TargetType="{x:Type Button}">
  5         <Setter Property="Focusable" Value="False" />
  6         <Setter Property="Background" Value="Transparent" />
  7         <Setter Property="BorderBrush" Value="Transparent" />
  8         <Setter Property="BorderThickness"  Value="1" />
  9         <Setter Property="HorizontalContentAlignment"   Value="Center" />
 10         <Setter Property="VerticalContentAlignment"  Value="Center" />
 11         <Setter Property="Template">
 12             <Setter.Value>
 13                 <ControlTemplate TargetType="{x:Type Button}">
 14                     <Grid>
 15                         <Rectangle x:Name="TitleButtonBackground"  Width="40" Height="40" Fill="Silver" Opacity="0" />
 16                         <Border x:Name="ButtonBorder" BorderBrush="{TemplateBinding BorderBrush}"  BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
 17                             <ContentPresenter x:Name="TitleButtonContent"  Focusable="False"  RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
 18                         </Border>
 19                     </Grid>
 20                     <ControlTemplate.Triggers>
 21                         <Trigger Property="IsMouseOver" Value="true">
 22                             <Setter Property="Opacity" Value=".5" TargetName="TitleButtonBackground" />
 23                         </Trigger>
 24                         <Trigger Property="IsPressed"  Value="True">
 25                             <Setter Property="Opacity" Value="0.4"  TargetName="TitleButtonBackground" />
 26                         </Trigger>
 27                         <Trigger Property="IsEnabled"   Value="false">
 28                             <Setter TargetName="TitleButtonContent"  Property="Opacity" Value=".5" />
 29                         </Trigger>
 30                     </ControlTemplate.Triggers>
 31                 </ControlTemplate>
 32             </Setter.Value>
 33         </Setter>
 34     </Style>
 35 
 36     <Style x:Key="CaptionCloseButtonStyle" TargetType="{x:Type Button}">
 37         <Setter Property="Focusable" Value="False" />
 38         <Setter Property="Background" Value="Transparent" />
 39         <Setter Property="BorderBrush" Value="Transparent" />
 40         <Setter Property="BorderThickness"  Value="1" />
 41         <Setter Property="HorizontalContentAlignment"   Value="Center" />
 42         <Setter Property="VerticalContentAlignment"  Value="Center" />
 43         <Setter Property="Template">
 44             <Setter.Value>
 45                 <ControlTemplate TargetType="{x:Type Button}">
 46                     <Grid x:Name="LayoutRoot">
 47                         <Rectangle x:Name="TitleButtonBackground"  Width="40" Height="40" Fill="Silver" Opacity="0" />
 48                         <Border x:Name="TitleButtonBorder" BorderBrush="{TemplateBinding BorderBrush}"  BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
 49                             <ContentPresenter x:Name="TitleButtonContent"  Focusable="False"  RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
 50                         </Border>
 51                     </Grid>
 52                     <ControlTemplate.Triggers>
 53                         <Trigger Property="IsMouseOver" Value="true">
 54                             <Setter Property="Background" Value="LightSkyBlue" TargetName="TitleButtonBorder" />
 55                         </Trigger>
 56                         <Trigger Property="IsPressed"  Value="True">
 57                             <Setter Property="Opacity" Value="0.4"  TargetName="TitleButtonBackground" />
 58                         </Trigger>
 59                         <Trigger Property="IsEnabled"   Value="false">
 60                             <Setter TargetName="TitleButtonContent"  Property="Opacity" Value=".5" />
 61                         </Trigger>
 62                     </ControlTemplate.Triggers>
 63                 </ControlTemplate>
 64             </Setter.Value>
 65         </Setter>
 66     </Style>
 67 
 68     <DataTemplate x:Key="Minimize">
 69         <Grid>
 70             <Path Data="M 7.2 14.2 L19.2 14.2" Width="26.4"  Height="26.4" VerticalAlignment="Center"  HorizontalAlignment="Center"  Stroke="Black" StrokeThickness="1" />
 71         </Grid>
 72     </DataTemplate>
 73 
 74     <DataTemplate x:Key="Maximize">
 75         <Grid>
 76             <Rectangle Width="10" Height="10" Stroke="Black" StrokeThickness="1" Margin="0,1,0,0"/>
 77         </Grid>
 78     </DataTemplate>
 79 
 80     <DataTemplate x:Key="Restore">
 81         <Grid>
 82             <Rectangle Width="10" Height="10" Stroke="Black" StrokeThickness="1" Margin="0,3,3,0"/>
 83             <Rectangle Width="8" Height="8" Stroke="Black" StrokeThickness="1" Margin="5,0,0,5"/>
 84         </Grid>
 85     </DataTemplate>
 86 
 87     <DataTemplate x:Key="Close">
 88         <Grid Width="15.6" Height="15.4">
 89             <Path Data="M 12,12 L16.4,16.4"  Stretch="Fill" Stroke="Black" StrokeThickness="1"/>
 90             <Path Data="M 12,16.4 L 16.4,12 "  Stretch="Fill" Stroke="Black" StrokeThickness="1"/>
 91         </Grid>
 92     </DataTemplate>
 93 
 94 
 95     <Style TargetType="{x:Type Window}" x:Key="WindowStyle">
 96         <Setter Property="BorderBrush"  Value="White" />
 97         <Setter Property="BorderThickness"  Value="1" />
 98         <Setter Property="ResizeMode"  Value="CanResizeWithGrip" />
 99         <Setter Property="UseLayoutRounding" Value="True" />
100         <Setter Property="TextOptions.TextFormattingMode"  Value="Display" />
101         <Setter Property="WindowStyle" Value="SingleBorderWindow" />
102         <Setter Property="FontFamily" Value="LightSkyBlue" />
103         <Setter Property="WindowChrome.WindowChrome">
104             <Setter.Value>
105                 <WindowChrome CornerRadius="0"  GlassFrameThickness="1" UseAeroCaptionButtons="False" NonClientFrameEdges="None" />
106             </Setter.Value>
107         </Setter>
108         <Setter Property="Template">
109             <Setter.Value>
110                 <ControlTemplate TargetType="{x:Type Window}">
111                     <Border BorderBrush="{TemplateBinding BorderBrush}"  BorderThickness="{TemplateBinding BorderThickness}" x:Name="WindowBorder" Background="{TemplateBinding Background}">
112                         <!-- Background="{TemplateBinding Background}"-->
113                         <!--<Border.Background>
114                             <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
115                                 <GradientStop Color="#FFFFF9F9" Offset="0"/>
116                                 <GradientStop Color="#FFA49B96" Offset="1"/>
117                             </LinearGradientBrush>
118                         </Border.Background>-->
119 
120                         <Grid x:Name="LayoutRoot">
121                             <Grid.RowDefinitions>
122                                 <RowDefinition Height="26.4" />
123                                 <RowDefinition />
124                             </Grid.RowDefinitions>
125 
126                             <Grid x:Name="PART_WindowTitleGrid"  Grid.Row="0" Background="Transparent" Panel.ZIndex="1">
127                                 <Grid.ColumnDefinitions>
128                                     <ColumnDefinition Width="*" />
129                                     <ColumnDefinition Width="Auto" />
130                                 </Grid.ColumnDefinitions>
131                                 <StackPanel Orientation="Horizontal">
132                                     <Button VerticalAlignment="Center" Margin="7,0,5,0"  Height="{x:Static SystemParameters.SmallIconHeight}" Width="{x:Static SystemParameters.SmallIconWidth}" WindowChrome.IsHitTestVisibleInChrome="True"                                         
133                                     IsTabStop="False" Command="{Binding Source={x:Static SystemCommands.ShowSystemMenuCommand}}" >
134                                         <Button.Template>
135                                             <ControlTemplate>
136                                                 <!--title image-->
137                                                 <Image Name="btnbg" HorizontalAlignment="Center" VerticalAlignment="Center"  Stretch="UniformToFill" Source="caption.png" Width="26.4" Height="26.4"/>
138                                             </ControlTemplate>
139                                         </Button.Template>
140                                     </Button>
141                                     <ContentControl IsTabStop="False"
142                                                     Foreground="LightSkyBlue"
143                                                     FontWeight="Bold"
144                                                     HorizontalAlignment="Center"
145                                                     VerticalAlignment="Center"
146                                                     FontSize="{DynamicResource {x:Static SystemFonts.CaptionFontSize}}"
147                                                     Content="{TemplateBinding Title}"  Margin="5,0,0,0"/>
148                                 </StackPanel>
149                                 <StackPanel x:Name="WindowCommandButtonsStackPanel"  Grid.Column="1" HorizontalAlignment="Right" VerticalAlignment="Top" Orientation="Horizontal" WindowChrome.IsHitTestVisibleInChrome="True">
150                                     <Button x:Name="Minimize" Width="26.4" Height="26.4" ToolTip="最小化"  WindowChrome.IsHitTestVisibleInChrome="True"  Command="{Binding Source={x:Static SystemCommands.MinimizeWindowCommand}}"  ContentTemplate="{StaticResource Minimize}"  Style="{StaticResource CaptionNormalButtonStyle}"  IsTabStop="False" Margin="0,0,2,0"></Button>
151                                     <Button x:Name="Restore" Width="26.4" Height="26.4" ToolTip="还原" WindowChrome.IsHitTestVisibleInChrome="True"  Command="{Binding Source={x:Static SystemCommands.RestoreWindowCommand}}"   Visibility="Collapsed" ContentTemplate="{StaticResource Restore}" Style="{StaticResource CaptionNormalButtonStyle}" IsTabStop="False"></Button>
152                                     <Button x:Name="Maximize"  Width="26.4" Height="26.4" ToolTip="最大化" WindowChrome.IsHitTestVisibleInChrome="True" Command="{Binding Source={x:Static SystemCommands.MaximizeWindowCommand}}"   ContentTemplate="{StaticResource Maximize}" Style="{StaticResource CaptionNormalButtonStyle}" Margin="0,0,1,0" IsTabStop="False"></Button>
153                                     <Button x:Name="Close" Width="26.4" Height="26.4" ToolTip="关闭"  WindowChrome.IsHitTestVisibleInChrome="True"  Command="{Binding Source={x:Static SystemCommands.CloseWindowCommand}}"   IsTabStop="False"  Style="{StaticResource CaptionCloseButtonStyle}"  ContentTemplate="{StaticResource Close}" ></Button>
154                                 </StackPanel>
155                             </Grid>
156                             <AdornerDecorator Grid.Row="0" Grid.RowSpan="2" KeyboardNavigation.IsTabStop="False">
157                                 <ContentPresenter/>
158                             </AdornerDecorator>
159 
160                             <Grid Grid.Row="0" Grid.RowSpan="2" Panel.ZIndex="-1">
161                                 <Grid>
162 
163                                     <!--window background-->
164                                     <!--<Grid.Background>
165                                         <ImageBrush ImageSource="../timg.jpg"  Stretch="UniformToFill"/>
166                                     </Grid.Background>-->
167 
168                                 </Grid>
169                             </Grid>
170                             <ResizeGrip x:Name="ResizeGrip"  HorizontalAlignment="Right" VerticalAlignment="Bottom" Grid.Row="1" IsTabStop="False" Visibility="Hidden" WindowChrome.ResizeGripDirection="BottomRight" />
171                         </Grid>
172                     </Border>
173 
174                     <ControlTemplate.Triggers>
175                         <Trigger Property="WindowState" Value="Maximized">
176                             <Setter TargetName="Maximize" Property="Visibility" Value="Collapsed" />
177                             <Setter TargetName="Restore" Property="Visibility" Value="Visible" />
178                             <Setter TargetName="LayoutRoot" Property="Margin"  Value="7" />
179                         </Trigger>
180                         <Trigger Property="WindowState" Value="Normal">
181                             <Setter TargetName="Maximize" Property="Visibility" Value="Visible" />
182                             <Setter TargetName="Restore" Property="Visibility" Value="Collapsed" />
183                         </Trigger>
184                         <Trigger Property="ResizeMode"  Value="NoResize">
185                             <Setter TargetName="Minimize" Property="Visibility" Value="Collapsed" />
186                             <Setter TargetName="Maximize" Property="Visibility" Value="Collapsed" />
187                             <Setter TargetName="Restore"  Property="Visibility" Value="Collapsed" />
188                         </Trigger>
189                         <MultiTrigger>
190                             <MultiTrigger.Conditions>
191                                 <Condition Property="ResizeMode"  Value="CanResizeWithGrip" />
192                                 <Condition Property="WindowState" Value="Normal" />
193                             </MultiTrigger.Conditions>
194                             <Setter TargetName="ResizeGrip" Property="Visibility" Value="Visible" />
195                         </MultiTrigger>
196                     </ControlTemplate.Triggers>
197                 </ControlTemplate>
198             </Setter.Value>
199         </Setter>
200     </Style>
201 </ResourceDictionary>

2、引入资源字典

在App.xaml中输入以下代码

1 <Application x:Class="DynamicWindow.App"
2              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4              xmlns:local="clr-namespace:DynamicWindow"
5              StartupUri="MainWindow.xaml">
6     <Application.Resources>
7         <ResourceDictionary Source="WindowStyle.xaml"/>
8     </Application.Resources>
9 </Application>

3、添加一个MediaElement控件

打开MainWindow.xaml,输入以下代码

 1 <Window x:Class="DynamicWindow.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6         xmlns:local="clr-namespace:DynamicWindow"
 7         mc:Ignorable="d"
 8         Title="MainWindow" Height="720" Width="1280" Style="{StaticResource WindowStyle}">
 9     <Grid>
10         <Grid.RowDefinitions>
11             <RowDefinition Height="26.4"/>
12             <RowDefinition/>
13         </Grid.RowDefinitions>
14         <Grid  Grid.RowSpan="2" Panel.ZIndex="-1" Grid.Row="0">
15             <MediaElement x:Name="mediaelement" Stretch="UniformToFill" Volume="1" LoadedBehavior="Manual"  UnloadedBehavior="Manual"/>
16         </Grid>
17 
18         <Grid Grid.Row="1">
19             <Button Content="播放" HorizontalAlignment="Left" VerticalAlignment="Top" Click="Button_Click"></Button>
20             <Button Content="停止" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="50,0,0,0" Click="Button_Click_1"></Button>
21         </Grid>
22     </Grid>
23 </Window>

4、运行,点击播放就可以看到效果

示例代码

2019.07.12

原文地址:https://www.cnblogs.com/zhaotianff/p/11175428.html