原文: WPF中反转3D列表项

                                          WPF中反转3D列表项
                                                         周银辉

记得在苹果电脑中有一个很酷的3D旋转效果, 它可以将某项的正反面进行反转, 在WPF中可以很轻松地做到该效果.
点击这里查看
也可以粘贴此代码XamlPad中查看:

WPF中反转3D列表项 随笔 第1张 < Page  xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
WPF中反转3D列表项 随笔 第2张      xmlns:s
="clr-namespace:System;assembly=mscorlib"
WPF中反转3D列表项 随笔 第3张      xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" >
WPF中反转3D列表项 随笔 第4张
WPF中反转3D列表项 随笔 第5张  
< Page .Resources >
WPF中反转3D列表项 随笔 第6张    
< x:Array  Type ="{x:Type s:String}"  x:Key ="src" >
WPF中反转3D列表项 随笔 第7张      
< s:String > Foo </ s:String >
WPF中反转3D列表项 随笔 第8张      
< s:String > Bar </ s:String >
WPF中反转3D列表项 随笔 第9张      
< s:String > Spong </ s:String >
WPF中反转3D列表项 随笔 第10张      
< s:String > One </ s:String >
WPF中反转3D列表项 随笔 第11张      
< s:String > Two </ s:String >
WPF中反转3D列表项 随笔 第12张      
< s:String > Three </ s:String >
WPF中反转3D列表项 随笔 第13张      
< s:String > Four </ s:String >
WPF中反转3D列表项 随笔 第14张      
< s:String > Five </ s:String >
WPF中反转3D列表项 随笔 第15张    
</ x:Array >
WPF中反转3D列表项 随笔 第16张
WPF中反转3D列表项 随笔 第17张
WPF中反转3D列表项 随笔 第18张    
< DataTemplate  x:Key ="frontTemplate" >
WPF中反转3D列表项 随笔 第19张      
< GroupBox  Header ="Front"  Background ="White" >
WPF中反转3D列表项 随笔 第20张        
< TextBlock  FontSize ="40"  Foreground ="Green"  Text ="{Binding}"   />
WPF中反转3D列表项 随笔 第21张      
</ GroupBox >
WPF中反转3D列表项 随笔 第22张    
</ DataTemplate >
WPF中反转3D列表项 随笔 第23张    
< DataTemplate  x:Key ="backTemplate" >
WPF中反转3D列表项 随笔 第24张      
< GroupBox  Header ="Back"  Background ="White" >
WPF中反转3D列表项 随笔 第25张        
< StackPanel >
WPF中反转3D列表项 随笔 第26张          
< RadioButton  Content ="This"  IsChecked ="True"   />
WPF中反转3D列表项 随笔 第27张          
< RadioButton  Content ="Is"   />
WPF中反转3D列表项 随笔 第28张          
< RadioButton  Content ="The"   />
WPF中反转3D列表项 随笔 第29张          
< RadioButton  Content ="Back"   />
WPF中反转3D列表项 随笔 第30张        
</ StackPanel >
WPF中反转3D列表项 随笔 第31张      
</ GroupBox >
WPF中反转3D列表项 随笔 第32张    
</ DataTemplate >
WPF中反转3D列表项 随笔 第33张
WPF中反转3D列表项 随笔 第34张    
< DataTemplate  x:Key ="flipItemTemplate" >
WPF中反转3D列表项 随笔 第35张
WPF中反转3D列表项 随笔 第36张      
<!--  Note: Camera setup only works when this is square.  -->
WPF中反转3D列表项 随笔 第37张      
< Grid  Width ="200"  Height ="200" >
WPF中反转3D列表项 随笔 第38张
WPF中反转3D列表项 随笔 第39张        
<!--  Provides 3D rotation transition. Hidden except for when animation is
WPF中反转3D列表项 随笔 第40张       active. 
-->
WPF中反转3D列表项 随笔 第41张        
< Viewport3D  Grid.Column ="0"  x:Name ="vp3D"  Visibility ="Hidden" >
WPF中反转3D列表项 随笔 第42张          
< Viewport3D .Camera >
WPF中反转3D列表项 随笔 第43张            
< PerspectiveCamera  x:Name ="camera"  Position ="0,0,0.5"  LookDirection ="0,0,-1"  FieldOfView ="90"   />
WPF中反转3D列表项 随笔 第44张          
</ Viewport3D.Camera >
WPF中反转3D列表项 随笔 第45张
WPF中反转3D列表项 随笔 第46张          
< Viewport3D .Children >
WPF中反转3D列表项 随笔 第47张
WPF中反转3D列表项 随笔 第48张            
< ModelVisual3D >
WPF中反转3D列表项 随笔 第49张              
< ModelVisual3D .Content >
WPF中反转3D列表项 随笔 第50张                
< Model3DGroup >
WPF中反转3D列表项 随笔 第51张                  
< DirectionalLight  Color ="#444"  Direction ="0,0,-1"   />
WPF中反转3D列表项 随笔 第52张                  
< AmbientLight  Color ="#BBB"   />
WPF中反转3D列表项 随笔 第53张                
</ Model3DGroup >
WPF中反转3D列表项 随笔 第54张              
</ ModelVisual3D.Content >
WPF中反转3D列表项 随笔 第55张            
</ ModelVisual3D >
WPF中反转3D列表项 随笔 第56张            
< ModelVisual3D >
WPF中反转3D列表项 随笔 第57张              
< ModelVisual3D .Content >
WPF中反转3D列表项 随笔 第58张                
< GeometryModel3D >
WPF中反转3D列表项 随笔 第59张
WPF中反转3D列表项 随笔 第60张
WPF中反转3D列表项 随笔 第61张                  
<!--  Simple flat, square surface  -->
WPF中反转3D列表项 随笔 第62张                  
< GeometryModel3D .Geometry >
WPF中反转3D列表项 随笔 第63张                    
< MeshGeometry3D
WPF中反转3D列表项 随笔 第64张                     
TriangleIndices ="0,1,2 2,3,0"
WPF中反转3D列表项 随笔 第65张                     TextureCoordinates
="0,1 1,1 1,0 0,0"
WPF中反转3D列表项 随笔 第66张                     Positions
="-0.5,-0.5,0 0.5,-0.5,0 0.5,0.5,0 -0.5,0.5,0"   />
WPF中反转3D列表项 随笔 第67张                  
</ GeometryModel3D.Geometry >
WPF中反转3D列表项 随笔 第68张
WPF中反转3D列表项 随笔 第69张
WPF中反转3D列表项 随笔 第70张                  
<!--  Front of shape shows the content of 'frontHost'  -->
WPF中反转3D列表项 随笔 第71张                  
< GeometryModel3D .Material >
WPF中反转3D列表项 随笔 第72张                    
< DiffuseMaterial >
WPF中反转3D列表项 随笔 第73张                      
< DiffuseMaterial .Brush >
WPF中反转3D列表项 随笔 第74张                        
< VisualBrush  Visual ="{Binding ElementName=frontHost}"   />
WPF中反转3D列表项 随笔 第75张                      
</ DiffuseMaterial.Brush >
WPF中反转3D列表项 随笔 第76张                    
</ DiffuseMaterial >
WPF中反转3D列表项 随笔 第77张                  
</ GeometryModel3D.Material >
WPF中反转3D列表项 随笔 第78张
WPF中反转3D列表项 随笔 第79张
WPF中反转3D列表项 随笔 第80张                  
<!--  Back of shape shows the content of 'backHost'  -->
WPF中反转3D列表项 随笔 第81张                  
< GeometryModel3D .BackMaterial >
WPF中反转3D列表项 随笔 第82张                    
< DiffuseMaterial >
WPF中反转3D列表项 随笔 第83张                      
< DiffuseMaterial .Brush >
WPF中反转3D列表项 随笔 第84张                        
< VisualBrush  Visual ="{Binding ElementName=backHost}" >
WPF中反转3D列表项 随笔 第85张                          
< VisualBrush .RelativeTransform >
WPF中反转3D列表项 随笔 第86张                            
<!--  By default, this would come out backwards because we're on the
WPF中反转3D列表项 随笔 第87张                                   back on the shape. Flip it to make it right. 
-->
WPF中反转3D列表项 随笔 第88张                            
< ScaleTransform  ScaleX ="-1"  CenterX ="0.5"   />
WPF中反转3D列表项 随笔 第89张                          
</ VisualBrush.RelativeTransform >
WPF中反转3D列表项 随笔 第90张                        
</ VisualBrush >
WPF中反转3D列表项 随笔 第91张                      
</ DiffuseMaterial.Brush >
WPF中反转3D列表项 随笔 第92张                    
</ DiffuseMaterial >
WPF中反转3D列表项 随笔 第93张                  
</ GeometryModel3D.BackMaterial >
WPF中反转3D列表项 随笔 第94张
WPF中反转3D列表项 随笔 第95张                  
<!--  Rotation transform used for transition.  -->
WPF中反转3D列表项 随笔 第96张                  
< GeometryModel3D .Transform >
WPF中反转3D列表项 随笔 第97张                    
< RotateTransform3D >
WPF中反转3D列表项 随笔 第98张                      
< RotateTransform3D .Rotation >
WPF中反转3D列表项 随笔 第99张                        
< AxisAngleRotation3D  x:Name ="rotate"  Axis ="0,3,0"  Angle ="0"   />
WPF中反转3D列表项 随笔 第100张                      
</ RotateTransform3D.Rotation >
WPF中反转3D列表项 随笔 第101张                    
</ RotateTransform3D >
WPF中反转3D列表项 随笔 第102张                  
</ GeometryModel3D.Transform >
WPF中反转3D列表项 随笔 第103张                
</ GeometryModel3D >
WPF中反转3D列表项 随笔 第104张              
</ ModelVisual3D.Content >
WPF中反转3D列表项 随笔 第105张            
</ ModelVisual3D >
WPF中反转3D列表项 随笔 第106张          
</ Viewport3D.Children >
WPF中反转3D列表项 随笔 第107张
WPF中反转3D列表项 随笔 第108张        
</ Viewport3D >
WPF中反转3D列表项 随笔 第109张
WPF中反转3D列表项 随笔 第110张        
<!--  We use a pair of nested Borders to wrap the content that's going to go on
WPF中反转3D列表项 随笔 第111张       each side of the rotating model.
WPF中反转3D列表项 随笔 第112张       The reason is that we need to be able to fade these real bits of UI in and out
WPF中反转3D列表项 随笔 第113张       as we transition from front to back, but we need to make sure the VisualBrush
WPF中反转3D列表项 随笔 第114张       in the 3D model doesn't also get faded out. So the VisualBrush uses the inner
WPF中反转3D列表项 随笔 第115张       Border, while the fade is applied to the outer one.
WPF中反转3D列表项 随笔 第116张  
-->
WPF中反转3D列表项 随笔 第117张        
< Border  x:Name ="frontWrapper" >
WPF中反转3D列表项 随笔 第118张          
<!--  Note, it's important that this element has visuals that completely fill the space, as
WPF中反转3D列表项 随笔 第119张       otherwise it messes with the VisualBrush's size in the 3D model. Setting the background
WPF中反转3D列表项 随笔 第120张       has that effect, even a transparent one. 
-->
WPF中反转3D列表项 随笔 第121张          
< Border  x:Name ="frontHost"  Background ="Transparent" >
WPF中反转3D列表项 随笔 第122张            
< Border .Triggers >
WPF中反转3D列表项 随笔 第123张              
< EventTrigger  RoutedEvent ="Grid.MouseDown" >
WPF中反转3D列表项 随笔 第124张                
< BeginStoryboard >
WPF中反转3D列表项 随笔 第125张                  
< Storyboard >
WPF中反转3D列表项 随笔 第126张                    
<!--  Make the Viewport3D visible only for the duration of the rotation.  -->
WPF中反转3D列表项 随笔 第127张                    
< ObjectAnimationUsingKeyFrames
WPF中反转3D列表项 随笔 第128张                           
Storyboard.TargetName ="vp3D"
WPF中反转3D列表项 随笔 第129张                           Storyboard.TargetProperty
="Visibility" >
WPF中反转3D列表项 随笔 第130张                      
< DiscreteObjectKeyFrame  KeyTime ="0:0:0"  Value ="{x:Static Visibility.Visible}"   />
WPF中反转3D列表项 随笔 第131张                      
< DiscreteObjectKeyFrame  KeyTime ="0:0:1.1"  Value ="{x:Static Visibility.Hidden}"   />
WPF中反转3D列表项 随笔 第132张                    
</ ObjectAnimationUsingKeyFrames >
WPF中反转3D列表项 随笔 第133张
WPF中反转3D列表项 随笔 第134张                    
<!--  Make the background element visible. (It won't actually appear until it is
WPF中反转3D列表项 随笔 第135张                 faded in right at the end of the animation.) 
-->
WPF中反转3D列表项 随笔 第136张                    
< ObjectAnimationUsingKeyFrames
WPF中反转3D列表项 随笔 第137张                           
Storyboard.TargetName ="backWrapper"
WPF中反转3D列表项 随笔 第138张                           Storyboard.TargetProperty
="Visibility" >
WPF中反转3D列表项 随笔 第139张                      
< DiscreteObjectKeyFrame  KeyTime ="0:0:1"  Value ="{x:Static Visibility.Visible}" />
WPF中反转3D列表项 随笔 第140张                    
</ ObjectAnimationUsingKeyFrames >
WPF中反转3D列表项 随笔 第141张
WPF中反转3D列表项 随笔 第142张
WPF中反转3D列表项 随笔 第143张                    
<!--  Hide the foreground element. It will already be invisible by this time
WPF中反转3D列表项 随笔 第144张                 because we fade it out right at the start of the animation. However, until
WPF中反转3D列表项 随笔 第145张                 we set its Visibility to Hidden, it will still be visible to the mouseWPF中反转3D列表项 随笔 第146张 
-->
WPF中反转3D列表项 随笔 第147张                    
< ObjectAnimationUsingKeyFrames
WPF中反转3D列表项 随笔 第148张                           
Storyboard.TargetName ="frontWrapper"
WPF中反转3D列表项 随笔 第149张                           Storyboard.TargetProperty
="Visibility" >
WPF中反转3D列表项 随笔 第150张                      
< DiscreteObjectKeyFrame  KeyTime ="0:0:0.05"  Value ="{x:Static Visibility.Hidden}"   />
WPF中反转3D列表项 随笔 第151张                    
</ ObjectAnimationUsingKeyFrames >
WPF中反转3D列表项 随笔 第152张
WPF中反转3D列表项 随笔 第153张
WPF中反转3D列表项 随笔 第154张                    
<!--  Fade the front wrapper out. The Viewport3D is behind us, so it'll fade into
WPF中反转3D列表项 随笔 第155张                 view at this point. The reason for fading is to avoid a visible step as we
WPF中反转3D列表项 随笔 第156张                 switch from the real UI to the copy projected onto the 3D model. 
-->
WPF中反转3D列表项 随笔 第157张                    
< DoubleAnimation  To ="0"  Duration ="0:0:0.05"
WPF中反转3D列表项 随笔 第158张                           Storyboard.TargetName
="frontWrapper"
WPF中反转3D列表项 随笔 第159张                           Storyboard.TargetProperty
="Opacity"   />
WPF中反转3D列表项 随笔 第160张
WPF中反转3D列表项 随笔 第161张                    
<!--  Fade the back wrapper in. Once the spin completes, we fade the real back UI
WPF中反转3D列表项 随笔 第162张                 in over the Viewport3D - using a fade to avoid a sudden jolt between the
WPF中反转3D列表项 随笔 第163张                 slightly fuzzy 3D look and the real UI. 
-->
WPF中反转3D列表项 随笔 第164张                    
< DoubleAnimation  BeginTime ="0:0:1.05"  Duration ="0:0:0.05"  To ="1"
WPF中反转3D列表项 随笔 第165张                           Storyboard.TargetName
="backWrapper"
WPF中反转3D列表项 随笔 第166张                           Storyboard.TargetProperty
="Opacity"   />
WPF中反转3D列表项 随笔 第167张
WPF中反转3D列表项 随笔 第168张                    
<!--  3D animation. Move the camera out slightly as we spin, so the model fits entirely
WPF中反转3D列表项 随笔 第169张                 within the field of view. Rotate the model 180 degrees. 
-->
WPF中反转3D列表项 随笔 第170张                    
< Point3DAnimation  To ="0,0,1.1"  From ="0,0,0.5"
WPF中反转3D列表项 随笔 第171张                           BeginTime
="0:0:0.05"  Duration ="0:0:0.5"  AutoReverse ="True"  DecelerationRatio ="0.3"
WPF中反转3D列表项 随笔 第172张                           Storyboard.TargetName
="camera"
WPF中反转3D列表项 随笔 第173张                           Storyboard.TargetProperty
="(PerspectiveCamera.Position)"   />
WPF中反转3D列表项 随笔 第174张                    
< DoubleAnimation  From ="0"  To ="180"  AccelerationRatio ="0.3"  DecelerationRatio ="0.3"
WPF中反转3D列表项 随笔 第175张                           BeginTime
="0:0:0.05"  Duration ="0:0:1"
WPF中反转3D列表项 随笔 第176张                           Storyboard.TargetName
="rotate"
WPF中反转3D列表项 随笔 第177张                           Storyboard.TargetProperty
="Angle"   />
WPF中反转3D列表项 随笔 第178张                  
</ Storyboard >
WPF中反转3D列表项 随笔 第179张                
</ BeginStoryboard >
WPF中反转3D列表项 随笔 第180张              
</ EventTrigger >
WPF中反转3D列表项 随笔 第181张            
</ Border.Triggers >
WPF中反转3D列表项 随笔 第182张            
< ContentPresenter   Content ="{Binding}"  ContentTemplate ="{StaticResource frontTemplate}"   />
WPF中反转3D列表项 随笔 第183张          
</ Border >
WPF中反转3D列表项 随笔 第184张        
</ Border >
WPF中反转3D列表项 随笔 第185张        
< Border  x:Name ="backWrapper"  Grid.Column ="0"   Visibility ="Hidden"  Opacity ="0" >
WPF中反转3D列表项 随笔 第186张          
< Border  x:Name ="backHost"  Background ="Transparent" >
WPF中反转3D列表项 随笔 第187张            
< Border .Triggers >
WPF中反转3D列表项 随笔 第188张              
< EventTrigger  RoutedEvent ="Grid.MouseDown" >
WPF中反转3D列表项 随笔 第189张                
< BeginStoryboard >
WPF中反转3D列表项 随笔 第190张                  
< Storyboard >
WPF中反转3D列表项 随笔 第191张                    
< ObjectAnimationUsingKeyFrames
WPF中反转3D列表项 随笔 第192张                           
Storyboard.TargetName ="vp3D"
WPF中反转3D列表项 随笔 第193张                           Storyboard.TargetProperty
="Visibility" >
WPF中反转3D列表项 随笔 第194张                      
< DiscreteObjectKeyFrame  KeyTime ="0:0:0"  Value ="{x:Static Visibility.Visible}"   />
WPF中反转3D列表项 随笔 第195张                      
< DiscreteObjectKeyFrame  KeyTime ="0:0:1.1"  Value ="{x:Static Visibility.Hidden}"   />
WPF中反转3D列表项 随笔 第196张                    
</ ObjectAnimationUsingKeyFrames >
WPF中反转3D列表项 随笔 第197张
WPF中反转3D列表项 随笔 第198张                    
< ObjectAnimationUsingKeyFrames
WPF中反转3D列表项 随笔 第199张                           
Storyboard.TargetName ="frontWrapper"
WPF中反转3D列表项 随笔 第200张                           Storyboard.TargetProperty
="Visibility" >
WPF中反转3D列表项 随笔 第201张                      
< DiscreteObjectKeyFrame  KeyTime ="0:0:1"  Value ="{x:Static Visibility.Visible}" />
WPF中反转3D列表项 随笔 第202张                    
</ ObjectAnimationUsingKeyFrames >
WPF中反转3D列表项 随笔 第203张                    
< ObjectAnimationUsingKeyFrames
WPF中反转3D列表项 随笔 第204张                           
Storyboard.TargetName ="backWrapper"
WPF中反转3D列表项 随笔 第205张                           Storyboard.TargetProperty
="Visibility" >
WPF中反转3D列表项 随笔 第206张                      
< DiscreteObjectKeyFrame  KeyTime ="0:0:0.05"  Value ="{x:Static Visibility.Hidden}"   />
WPF中反转3D列表项 随笔 第207张                    
</ ObjectAnimationUsingKeyFrames >
WPF中反转3D列表项 随笔 第208张
WPF中反转3D列表项 随笔 第209张                    
< DoubleAnimation  To ="0"  Duration ="0:0:0.05"
WPF中反转3D列表项 随笔 第210张                           Storyboard.TargetName
="backWrapper"
WPF中反转3D列表项 随笔 第211张                           Storyboard.TargetProperty
="Opacity"   />
WPF中反转3D列表项 随笔 第212张                    
< DoubleAnimation  BeginTime ="0:0:1.05"  Duration ="0:0:0.05"
WPF中反转3D列表项 随笔 第213张                           Storyboard.TargetName
="frontWrapper"
WPF中反转3D列表项 随笔 第214张                           Storyboard.TargetProperty
="Opacity"   />
WPF中反转3D列表项 随笔 第215张
WPF中反转3D列表项 随笔 第216张                    
< Point3DAnimation  To ="0,0,1.1"  From ="0,0,0.5"
WPF中反转3D列表项 随笔 第217张                           BeginTime
="0:0:0.05"  Duration ="0:0:0.5"  AutoReverse ="True"  DecelerationRatio ="0.3"
WPF中反转3D列表项 随笔 第218张                           Storyboard.TargetName
="camera"
WPF中反转3D列表项 随笔 第219张                           Storyboard.TargetProperty
="(PerspectiveCamera.Position)"   />
WPF中反转3D列表项 随笔 第220张                    
< DoubleAnimation  From ="180"  To ="360"  AccelerationRatio ="0.3"  DecelerationRatio ="0.3"
WPF中反转3D列表项 随笔 第221张                           BeginTime
="0:0:0.05"  Duration ="0:0:1"
WPF中反转3D列表项 随笔 第222张                           Storyboard.TargetName
="rotate"
WPF中反转3D列表项 随笔 第223张                           Storyboard.TargetProperty
="Angle"   />
WPF中反转3D列表项 随笔 第224张                  
</ Storyboard >
WPF中反转3D列表项 随笔 第225张                
</ BeginStoryboard >
WPF中反转3D列表项 随笔 第226张              
</ EventTrigger >
WPF中反转3D列表项 随笔 第227张            
</ Border.Triggers >
WPF中反转3D列表项 随笔 第228张            
< ContentPresenter  Content ="{Binding}"  ContentTemplate ="{StaticResource backTemplate}"   />
WPF中反转3D列表项 随笔 第229张          
</ Border >
WPF中反转3D列表项 随笔 第230张        
</ Border >
WPF中反转3D列表项 随笔 第231张
WPF中反转3D列表项 随笔 第232张
WPF中反转3D列表项 随笔 第233张      
</ Grid >
WPF中反转3D列表项 随笔 第234张    
</ DataTemplate >
WPF中反转3D列表项 随笔 第235张
WPF中反转3D列表项 随笔 第236张  
</ Page.Resources >
WPF中反转3D列表项 随笔 第237张
WPF中反转3D列表项 随笔 第238张  
< ScrollViewer >
WPF中反转3D列表项 随笔 第239张    
< ItemsControl  ItemsSource ="{StaticResource src}"  ItemTemplate ="{StaticResource flipItemTemplate}" >
WPF中反转3D列表项 随笔 第240张      
< ItemsControl .ItemsPanel >
WPF中反转3D列表项 随笔 第241张        
< ItemsPanelTemplate >
WPF中反转3D列表项 随笔 第242张          
< WrapPanel  />
WPF中反转3D列表项 随笔 第243张        
</ ItemsPanelTemplate >
WPF中反转3D列表项 随笔 第244张      
</ ItemsControl.ItemsPanel >
WPF中反转3D列表项 随笔 第245张
WPF中反转3D列表项 随笔 第246张    
</ ItemsControl >
WPF中反转3D列表项 随笔 第247张  
</ ScrollViewer >
WPF中反转3D列表项 随笔 第248张
WPF中反转3D列表项 随笔 第249张
WPF中反转3D列表项 随笔 第250张
</ Page >
WPF中反转3D列表项 随笔 第251张
WPF中反转3D列表项 随笔 第252张

更多请参考这里: http://www.interact-sw.co.uk/iangblog/2007/05/17/wpf-flippable-3D-list
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。