WPF實(shí)現(xiàn)3D翻牌式倒計(jì)時(shí)特效
本文實(shí)例為大家分享了WPF實(shí)現(xiàn)3D翻牌式倒計(jì)時(shí)的具體代碼,供大家參考,具體內(nèi)容如下
實(shí)現(xiàn)效果如下:
思路:使用自定義控件,設(shè)置一個(gè)背板 MyCardControlBottom,一個(gè)卡牌翻動的前部 MyCardControlFront,一個(gè)卡牌翻動后的背部 MyCardControlBack,另外實(shí)現(xiàn)卡牌翻動的MyCardControl;在主窗體中設(shè)置一計(jì)時(shí)器,根據(jù)卡牌上的數(shù)字和計(jì)時(shí)器時(shí)間啟動翻牌動作。
主要代碼:
1、自定義控件MyCardControlBottom
<UserControl x:Class="TurnOverCards.MyCardControlBottom" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" x:Name="MyUserControl" Height="300" Width="200"> <Border BorderThickness="0"> <Border.Effect> <DropShadowEffect BlurRadius="20" Color="Gray" Direction="-90" ShadowDepth="10"></DropShadowEffect> </Border.Effect> <Border.Background> <RadialGradientBrush GradientOrigin="0.5,0.5" Center="0.5,0.5" RadiusX="0.75" RadiusY="0.65"> <GradientStop Color="DimGray" Offset="0" /> <GradientStop Color="Black" Offset="1" /> </RadialGradientBrush> </Border.Background> <Grid> <Grid.RowDefinitions> <RowDefinition></RowDefinition> <RowDefinition></RowDefinition> </Grid.RowDefinitions> <TextBlock Grid.Row="0" Text="{Binding ElementName=MyUserControl,Path=BottomText}" FontFamily="Arial" Foreground="White" FontSize="150" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0,65,0,2"> <TextBlock.Effect> <DropShadowEffect BlurRadius="10" Color="Black" Direction="-90" ShadowDepth="2"></DropShadowEffect> </TextBlock.Effect> </TextBlock> <TextBlock Grid.Row="1" Text="{Binding ElementName=MyUserControl,Path=BottomText}" FontFamily="Arial" Foreground="White" FontSize="150" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="0,0,0,65"> <TextBlock.Effect> <DropShadowEffect BlurRadius="10" Color="Black" Direction="-90" ShadowDepth="2"></DropShadowEffect> </TextBlock.Effect> </TextBlock> </Grid> </Border> </UserControl>
其中BottomText為自定義屬性。
public static readonly DependencyProperty BottomTextProperty = DependencyProperty.Register("BottomText", typeof(string), typeof(MyCardControlBottom), new PropertyMetadata(null)); public string BottomText { get { return (string)GetValue(BottomTextProperty); } set { SetValue(BottomTextProperty, value); } }
2、自定義控件MyCardControlFront
<UserControl x:Class="TurnOverCards.MyCardControlFront" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" x:Name="MyUserControl" Height="150" Width="200"> <Border BorderThickness="0" ClipToBounds="True"> <Border.Background> <RadialGradientBrush GradientOrigin="0.5,0.75" Center="0.5,0.5" RadiusX="0.75" RadiusY="0.75"> <GradientStop Color="DimGray" Offset="0" /> <GradientStop Color="Black" Offset="1" /> </RadialGradientBrush> </Border.Background> <TextBlock Text="{Binding ElementName=MyUserControl,Path=FrontText}" FontFamily="Arial" Foreground="White" FontSize="150" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0,65,0,2"> <TextBlock.Effect> <DropShadowEffect BlurRadius="10" Color="Black" Direction="-90" ShadowDepth="2"></DropShadowEffect> </TextBlock.Effect> </TextBlock> </Border> </UserControl>
其中FrontText為自定義屬性。
3、自定義控件MyCardControlBack
窗體大部分布局與MyCardControlFront 相同,字體部分需要進(jìn)行翻轉(zhuǎn)顯示,其中BackText為自定義屬性。
<TextBlock Text="{Binding ElementName=MyUserControl,Path=BackText}" FontFamily="Arial" Foreground="White" FontSize="150" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="0,0,0,-85" RenderTransformOrigin="0.5,0.5"> <TextBlock.Effect> <DropShadowEffect BlurRadius="10" Color="Black" Direction="-90" ShadowDepth="2"></DropShadowEffect> </TextBlock.Effect> <TextBlock.RenderTransform > <ScaleTransform ScaleX="-1" ScaleY="-1"/> </TextBlock.RenderTransform> </TextBlock>
4、自定義控件MyCardControl
卡牌翻轉(zhuǎn)動作在這里實(shí)現(xiàn)。
<UserControl x:Class="TurnOverCards.MyCardControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:TurnOverCards" x:Name="UserControl" Loaded="MyUserControl_Loaded"> <Viewport3D Width="200" Height="300"> <Viewport3D.Camera> <PerspectiveCamera Position="0 -150 480" LookDirection="0 0 -1"/> </Viewport3D.Camera> <Viewport3D.Children> <ModelVisual3D> <ModelVisual3D.Content> <DirectionalLight Color="Transparent"/> </ModelVisual3D.Content> </ModelVisual3D> <ContainerUIElement3D> <Viewport2DVisual3D> <Viewport2DVisual3D.Geometry> <MeshGeometry3D Positions="-200 150 0 -200 -150 0 200 -150 0 200 150 0" TriangleIndices="0 1 2 0 2 3" TextureCoordinates="0 0 0 1 1 1 1 0"/> </Viewport2DVisual3D.Geometry> <Viewport2DVisual3D.Material> <DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="True"/> </Viewport2DVisual3D.Material> <Viewport2DVisual3D.Visual> <local:MyCardControlFront x:Name="frontControl" Width="200" Height="150"/> </Viewport2DVisual3D.Visual> </Viewport2DVisual3D> <Viewport2DVisual3D> <Viewport2DVisual3D.Geometry> <MeshGeometry3D Positions="200 150 0 200 -150 0 -200 -150 0 -200 150 0" TriangleIndices="0 1 2 0 2 3" TextureCoordinates="0 0 0 1 1 1 1 0"/> </Viewport2DVisual3D.Geometry> <Viewport2DVisual3D.Material> <DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="True"/> </Viewport2DVisual3D.Material> <Viewport2DVisual3D.Visual> <local:MyCardControlBack x:Name="backControl" Width="200" Height="150"/> </Viewport2DVisual3D.Visual> </Viewport2DVisual3D> <ContainerUIElement3D.Transform> <Transform3DGroup> <RotateTransform3D CenterX="0" CenterY="-150" CenterZ="0"> <RotateTransform3D.Rotation> <AxisAngleRotation3D x:Name="MyAxisAngleRotation3D" Angle="0" Axis="1 0 0"/> </RotateTransform3D.Rotation> </RotateTransform3D> </Transform3DGroup> </ContainerUIElement3D.Transform> </ContainerUIElement3D> </Viewport3D.Children> </Viewport3D> </UserControl>
加載時(shí)賦值:
public int ShowValue { get; set; } private void MyUserControl_Loaded(object sender, RoutedEventArgs e) { this.frontControl.FrontText = ShowValue.ToString(); }
5、主窗體交互邏輯
private int Count = 10; private DispatcherTimer frameTimer; private int TimeValue = 0; private void Window_Loaded(object sender, RoutedEventArgs e) { this.bottomControl.BottomText = Count.ToString(); for (int i = 1; i <= Count; i++) { var card = new MyCardControl(); card.ShowValue = i; this.mainGrid.Children.Add(card); Canvas.SetZIndex(card, i); } frameTimer = new DispatcherTimer(); frameTimer.Tick += OnFrame; frameTimer.Interval = TimeSpan.FromSeconds(1); frameTimer.Start(); } private void OnFrame(object sender, EventArgs e) { if (TimeValue >= Count) { if (frameTimer != null) frameTimer.Stop(); return; } if(TimeValue == Count - 1) { this.bottomControl.BottomText = 0.ToString(); } List<MyCardControl> cardList = GetChildObjects<MyCardControl>(this.mainGrid); foreach (var item in cardList) { if(item.ShowValue == Count - TimeValue) { Canvas.SetZIndex(item, Count + TimeValue); DoubleAnimation da = new DoubleAnimation(); da.Duration = new Duration(TimeSpan.FromSeconds(1)); da.To = 180d; item.ShowValue--; item.backControl.BackText = item.ShowValue.ToString(); AxisAngleRotation3D aar = item.FindName("MyAxisAngleRotation3D") as AxisAngleRotation3D; if (aar != null) aar.BeginAnimation(AxisAngleRotation3D.AngleProperty, da); break; } } TimeValue++; }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Unity3D Shader實(shí)現(xiàn)流光效果
這篇文章主要為大家詳細(xì)介紹了Unity3D Shader實(shí)現(xiàn)流光效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04C#?使用原生?System.IO.Compression?實(shí)現(xiàn)?zip?的壓縮與解壓
這篇文章主要介紹了C#?使用原生?System.IO.Compression?實(shí)現(xiàn)?zip?的壓縮與解壓,zip?是一個(gè)非常常見的壓縮包格式,本文主要用于說明如何使用代碼?文件或文件夾壓縮為?zip壓縮包及其解壓操作,需要的朋友可以參考下2022-09-09C#四種計(jì)時(shí)器Timer的區(qū)別和用法
這篇文章介紹了C#四種計(jì)時(shí)器Timer的區(qū)別和用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05解析Silverlight調(diào)用WCF/Rest異常的解決方法
本篇文章對Silverlight調(diào)用WCF/Rest異常的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C#使用channel實(shí)現(xiàn)Plc異步任務(wù)之間的通信
在C#的并發(fā)編程中,Channel是一種非常強(qiáng)大的數(shù)據(jù)結(jié)構(gòu),用于在生產(chǎn)者和消費(fèi)者之間進(jìn)行通信,本文將給大家介紹C#使用channel實(shí)現(xiàn)Plc異步任務(wù)之間的通信,文中有相關(guān)的代碼示例供大家參考,感興趣的朋友跟著小編一起來看看吧2024-05-05