WPF编程,等待动画的几中实现形式

全部效果

在这里插入图片描述

持续更新…

类型1

效果
在这里插入图片描述
思路

1、用8个浅灰色的圆当背景
2、4个渐变深灰色的圆,一直改变其旋转角度,表示Loading的过程

首先,定位下图圆的位置(红色线为辅助线),剩余的直接旋转角度就行。
在这里插入图片描述

画布长宽为100

<Canvas Width="100" Height="100">

圆的半径是25,设计其基础的样式。因为剩余的圆是通过该圆旋转得到的,旋转的中心是上图中几条红色直线相交的那个点,不难算出RenderTransformOrigin0.5,2,这个很关键。

<Style x:Key="ellipse" TargetType="Ellipse">
    <Setter Property="Width" Value="25"/>
    <Setter Property="Height" Value="25"/>
    <Setter Property="RenderTransformOrigin" Value="0.5, 2"/>
    <Setter Property="Fill" Value="#FFAAAAAA"/>
    <Setter Property="Canvas.Left" Value="37.5"/>
    <Setter Property="Canvas.Top" Value="0"/>
</Style>

剩下的就是旋转啦

<!-- 8个背景圆 -->
<Ellipse Style="{StaticResource ellipse}">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="0"/>
    </Ellipse.RenderTransform>
</Ellipse>
<Ellipse Style="{StaticResource ellipse}">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="45"/>
    </Ellipse.RenderTransform>
</Ellipse>
<Ellipse Style="{StaticResource ellipse}">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="90"/>
    </Ellipse.RenderTransform>
</Ellipse>
<Ellipse Style="{StaticResource ellipse}">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="135"/>
    </Ellipse.RenderTransform>
</Ellipse>
<Ellipse Style="{StaticResource ellipse}">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="180"/>
    </Ellipse.RenderTransform>
</Ellipse>
<Ellipse Style="{StaticResource ellipse}">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="225"/>
    </Ellipse.RenderTransform>
</Ellipse>
<Ellipse Style="{StaticResource ellipse}">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="270"/>
    </Ellipse.RenderTransform>
</Ellipse>
<Ellipse Style="{StaticResource ellipse}">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="315"/>
    </Ellipse.RenderTransform>
</Ellipse>
<!-- 4个一直旋转的圆 -->
<Ellipse Name="ell1" Style="{StaticResource ellipse}" Fill="Black" Opacity="0.3">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="45"/>
    </Ellipse.RenderTransform>
</Ellipse>
<Ellipse Name="ell2" Style="{StaticResource ellipse}" Fill="Black" Opacity="0.4">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="90"/>
    </Ellipse.RenderTransform>
</Ellipse>
<Ellipse Name="ell3" Style="{StaticResource ellipse}" Fill="Black" Opacity="0.5">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="135"/>
    </Ellipse.RenderTransform>
</Ellipse>
<Ellipse Name="ell4" Style="{StaticResource ellipse}" Fill="Black" Opacity="0.6">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="180"/>
    </Ellipse.RenderTransform>
</Ellipse>

这样就能得到上图了。

如何旋转圆ell1 ell2 ell3 ell4呢?
这里用了关键帧动画DoubleAnimationUsingKeyFrames改变RotateTransformAngle属性。对于圆ell1,其初始旋转角度是45°,那还需要旋转到90°、135°、180°、225°、270°、315°、360°共7个角度,不难写出动画代码,其他三个类似。

<Storyboard x:Key="sb1" RepeatBehavior="Forever">
     <DoubleAnimationUsingKeyFrames Storyboard.TargetName="ell1" 
         Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)">
         <DiscreteDoubleKeyFrame KeyTime="0:0:0.1" Value="90"/>
         <DiscreteDoubleKeyFrame KeyTime="0:0:0.2" Value="135"/>
         <DiscreteDoubleKeyFrame KeyTime="0:0:0.3" Value="180"/>
         <DiscreteDoubleKeyFrame KeyTime="0:0:0.4" Value="225"/>
         <DiscreteDoubleKeyFrame KeyTime="0:0:0.5" Value="270"/>
         <DiscreteDoubleKeyFrame KeyTime="0:0:0.6" Value="315"/>
         <DiscreteDoubleKeyFrame KeyTime="0:0:0.7" Value="360"/>
     </DoubleAnimationUsingKeyFrames>
 </Storyboard>

然后在画布加载事件中触发

<Canvas.Triggers>
    <EventTrigger RoutedEvent="Loaded">
        <BeginStoryboard Storyboard="{StaticResource sb1}"/>
        <BeginStoryboard Storyboard="{StaticResource sb2}"/>
        <BeginStoryboard Storyboard="{StaticResource sb3}"/>
        <BeginStoryboard Storyboard="{StaticResource sb4}"/>
    </EventTrigger>
</Canvas.Triggers>

类型2

效果:
在这里插入图片描述

思路:

使用两个弧Arc,一个充当背景,一个作动画
关于Arc可以参考这个

代码:

<Canvas Width="100" Height="100">
   <Canvas.Triggers>
       <EventTrigger RoutedEvent="Loaded">
           <BeginStoryboard>
               <Storyboard RepeatBehavior="Forever" Storyboard.TargetName="arc">
                   <DoubleAnimation Storyboard.TargetProperty="EndAngle" To="360" BeginTime="0:0:0" Duration="0:0:1">
                       <DoubleAnimation.EasingFunction>
                           <PowerEase EasingMode="EaseInOut" Power="3"/>
                       </DoubleAnimation.EasingFunction>
                   </DoubleAnimation>
                   <DoubleAnimation Storyboard.TargetProperty="StartAngle" To="360" BeginTime="0:0:1" Duration="0:0:1">
                       <DoubleAnimation.EasingFunction>
                           <PowerEase EasingMode="EaseInOut" Power="3"/>
                       </DoubleAnimation.EasingFunction>
                   </DoubleAnimation>
               </Storyboard>
           </BeginStoryboard>
       </EventTrigger>
   </Canvas.Triggers>
   <ed:Arc Width="80"
           Height="80"
           StartAngle="0" 
           EndAngle="360"
           Stretch="None"
           ArcThickness="12"
           Fill="#fff1c1">
   </ed:Arc>
   <ed:Arc Width="80"
           Height="80"
           Name="arc"
           StartAngle="0" 
           EndAngle="0"
           Stretch="None"
           ArcThickness="12"
           Fill="#fe5f55">
   </ed:Arc>
</Canvas>

使用缓动函数看起来更自然。使用幂函数,这里是 Power=“3” 次幂,来加速(EaseIn)或减速动画(EaseOut),这里 EasingMode=“EaseInOut” 表示动画开始和结束时减速。

<DoubleAnimation.EasingFunction>
    <PowerEase EasingMode="EaseInOut" Power="3"/>
</DoubleAnimation.EasingFunction>

类似这样的图:
在这里插入图片描述

类型3

效果:
在这里插入图片描述

GIF看的有点卡,实际不卡。

样式

<Grid Background="White">
    <Grid.Resources>
        <Style x:Key="ellipse" TargetType="Ellipse">
            <Setter Property="Width" Value="15"/>
            <Setter Property="Height" Value="15"/>
            <Setter Property="Canvas.Left" Value="42.5"/>
            <Setter Property="Fill" Value="#0d3f67"/>
            <Setter Property="RenderTransformOrigin" Value="0.5,3.33"/>
        </Style>

        <PowerEase x:Key="powerease" Power="3" EasingMode="EaseInOut"/>
        
    </Grid.Resources>
    <Canvas Width="100" Height="100">
        <Canvas.Triggers>
            <EventTrigger RoutedEvent="Loaded">
                <BeginStoryboard>
                    <Storyboard Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)" RepeatBehavior="Forever">
                        <DoubleAnimation Storyboard.TargetName="e1" To="360" Duration="0:0:2" EasingFunction="{StaticResource powerease}" AccelerationRatio="0.1" DecelerationRatio="0.9"/>
                        <DoubleAnimation Storyboard.TargetName="e2" To="360" Duration="0:0:2" EasingFunction="{StaticResource powerease}" AccelerationRatio="0.3" DecelerationRatio="0.7"/>
                        <DoubleAnimation Storyboard.TargetName="e3" To="360" Duration="0:0:2" EasingFunction="{StaticResource powerease}" AccelerationRatio="0.5" DecelerationRatio="0.5"/>
                        <DoubleAnimation Storyboard.TargetName="e4" To="360" Duration="0:0:2" EasingFunction="{StaticResource powerease}" AccelerationRatio="0.7" DecelerationRatio="0.3"/>
                        <DoubleAnimation Storyboard.TargetName="e5" To="360" Duration="0:0:2" EasingFunction="{StaticResource powerease}" AccelerationRatio="0.9" DecelerationRatio="0.1"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Canvas.Triggers>
        
        <!--背景-->
        <Ellipse Width="100" Height="100" Fill="#f2f4f6"/>
        <Label Content="Loading"
               FontSize="16"
               FontFamily="Times New Roman"
               Foreground="#6b48ff"
               FontWeight="Bold"
               Width="100" 
               Height="100"
               VerticalContentAlignment="Center" 
               HorizontalContentAlignment="Center"/>

        <Ellipse Name="e1" Style="{StaticResource ellipse}">
            <Ellipse.RenderTransform>
                <RotateTransform Angle="0"/>
            </Ellipse.RenderTransform>
        </Ellipse>
        <Ellipse Name="e2" Style="{StaticResource ellipse}">
            <Ellipse.RenderTransform>
                <RotateTransform Angle="0"/>
            </Ellipse.RenderTransform>
        </Ellipse>
        <Ellipse Name="e3" Style="{StaticResource ellipse}">
            <Ellipse.RenderTransform>
                <RotateTransform Angle="0"/>
            </Ellipse.RenderTransform>
        </Ellipse>
        <Ellipse Name="e4" Style="{StaticResource ellipse}">
            <Ellipse.RenderTransform>
                <RotateTransform Angle="0"/>
            </Ellipse.RenderTransform>
        </Ellipse>
        <Ellipse Name="e5" Style="{StaticResource ellipse}">
            <Ellipse.RenderTransform>
                <RotateTransform Angle="0"/>
            </Ellipse.RenderTransform>
        </Ellipse>
    </Canvas>
</Grid>

使用了缓动函数PowerEase来控制5个圆的旋转速度。

类型4

效果
在这里插入图片描述
样式

 <Style x:Key="ellipse" TargetType="Ellipse">
     <Setter Property="Width" Value="20"/>
     <Setter Property="Height" Value="20"/>
     <Setter Property="Fill" Value="#41b6e6"/>
     <Setter Property="RenderTransform">
         <Setter.Value>
             <TranslateTransform X="0" Y="0"/>
         </Setter.Value>
     </Setter>
 </Style>
 
 <PowerEase x:Key="powerEase" Power="2" EasingMode="EaseInOut"/>

<Canvas Background="White" Width="200" Height="200">
    <Canvas.Triggers>
        <EventTrigger RoutedEvent="Loaded">
            <BeginStoryboard>
                <Storyboard RepeatBehavior="Forever" Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.Y)">
                    <DoubleAnimation Storyboard.TargetName="e1" To="-50" BeginTime="0:0:0.0" Duration="0:0:0.5" AutoReverse="True" EasingFunction="{StaticResource powerEase}"/>
                    <DoubleAnimation Storyboard.TargetName="e2" To="-50" BeginTime="0:0:0.1" Duration="0:0:0.5" AutoReverse="True" EasingFunction="{StaticResource powerEase}"/>
                    <DoubleAnimation Storyboard.TargetName="e3" To="-50" BeginTime="0:0:0.2" Duration="0:0:0.5" AutoReverse="True" EasingFunction="{StaticResource powerEase}"/>
                    <DoubleAnimation Storyboard.TargetName="e4" To="-50" BeginTime="0:0:0.3" Duration="0:0:0.5" AutoReverse="True" EasingFunction="{StaticResource powerEase}"/>
                    <DoubleAnimation Storyboard.TargetName="e5" To="-50" BeginTime="0:0:0.4" Duration="0:0:0.5" AutoReverse="True" EasingFunction="{StaticResource powerEase}"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Canvas.Triggers>

    
    <Label Content="Loading"
           FontSize="16"
           FontFamily="Times New Roman"
           Foreground="#ffb549"
           FontWeight="Bold"
           Width="200"
           HorizontalContentAlignment="Center"
           Canvas.Top="100"/>

    <Ellipse Name="e1" Canvas.Left="30" Canvas.Top="80" Style="{StaticResource ellipse}"/>
    <Ellipse Name="e2" Canvas.Left="60" Canvas.Top="80" Style="{StaticResource ellipse}"/>
    <Ellipse Name="e3" Canvas.Left="90" Canvas.Top="80" Style="{StaticResource ellipse}"/>
    <Ellipse Name="e4" Canvas.Left="120" Canvas.Top="80" Style="{StaticResource ellipse}"/>
    <Ellipse Name="e5" Canvas.Left="150" Canvas.Top="80" Style="{StaticResource ellipse}"/>
</Canvas>

类型5

在这里插入图片描述
样式

<Grid Background="White" HorizontalAlignment="Center">
    <Grid.Resources>
        <Style x:Key="rec" TargetType="Rectangle">
            <Setter Property="Width" Value="10"/>
            <Setter Property="Height" Value="30"/>
            <Setter Property="Fill" Value="#f1404b"/>
        </Style>
        <PowerEase x:Key="powerEase" Power="3" EasingMode="EaseInOut"/>
    </Grid.Resources>
    <Grid.Triggers>
        <EventTrigger RoutedEvent="Loaded">
            <BeginStoryboard>
                <Storyboard RepeatBehavior="Forever" Storyboard.TargetProperty="Height">
                    <DoubleAnimation Storyboard.TargetName="rec1" To="50" BeginTime="0:0:0.0" Duration="0:0:0.5" EasingFunction="{StaticResource powerEase}" AutoReverse="True"/>
                    <DoubleAnimation Storyboard.TargetName="rec2" To="50" BeginTime="0:0:0.2" Duration="0:0:0.5" EasingFunction="{StaticResource powerEase}" AutoReverse="True"/>
                    <DoubleAnimation Storyboard.TargetName="rec3" To="50" BeginTime="0:0:0.4" Duration="0:0:0.5" EasingFunction="{StaticResource powerEase}" AutoReverse="True"/>
                    <DoubleAnimation Storyboard.TargetName="rec4" To="50" BeginTime="0:0:0.6" Duration="0:0:0.5" EasingFunction="{StaticResource powerEase}" AutoReverse="True"/>
                    <DoubleAnimation Storyboard.TargetName="rec5" To="50" BeginTime="0:0:0.8" Duration="0:0:0.5" EasingFunction="{StaticResource powerEase}" AutoReverse="True"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Grid.Triggers>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="15"/>
        <ColumnDefinition Width="15"/>
        <ColumnDefinition Width="15"/>
        <ColumnDefinition Width="15"/>
        <ColumnDefinition Width="15"/>
    </Grid.ColumnDefinitions>
    <Label Content="Loading"
           FontSize="18"
           FontFamily="Times New Roman"
           Foreground="#252c41"
           FontWeight="Bold"
           Grid.ColumnSpan="5"
           VerticalContentAlignment="Center"
           HorizontalContentAlignment="Center"
           Margin="0,80,0,0"/>
    <Rectangle Name="rec1" Grid.Column="0" Style="{StaticResource rec}"/>
    <Rectangle Name="rec2" Grid.Column="1" Style="{StaticResource rec}"/>
    <Rectangle Name="rec3" Grid.Column="2" Style="{StaticResource rec}"/>
    <Rectangle Name="rec4" Grid.Column="3" Style="{StaticResource rec}"/>
    <Rectangle Name="rec5" Grid.Column="4" Style="{StaticResource rec}"/>
</Grid>

类型6

需要了解一点3D知识,戳这里
在这里插入图片描述
样式

<Grid Background="White" Width="200" Height="200">
    <Grid.Resources>
        <PowerEase x:Key="powerEase" Power="3" EasingMode="EaseIn"/>
    </Grid.Resources>
    <Viewport3D Width="200" Height="200">
        <Viewport3D.Triggers>
            <EventTrigger RoutedEvent="Loaded">
                <BeginStoryboard>
                    <Storyboard RepeatBehavior="Forever" Storyboard.TargetProperty="Angle">
                        <DoubleAnimation Storyboard.TargetName="axisX" To="180" BeginTime="0:0:0" Duration="0:0:0.5" EasingFunction="{StaticResource powerEase}"/>
                        <DoubleAnimation Storyboard.TargetName="axisY" To="180" BeginTime="0:0:0.5" Duration="0:0:0.5" EasingFunction="{StaticResource powerEase}"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Viewport3D.Triggers>
        <!--垂直屏幕往里-->
        <Viewport3D.Camera>
            <PerspectiveCamera Position="0,0,800" LookDirection="0,0,-1"/>
        </Viewport3D.Camera>
        <Viewport3D.Children>
            <ContainerUIElement3D>
                <!--正面-->
                <Viewport2DVisual3D>
                    <Viewport2DVisual3D.Geometry>
                        <MeshGeometry3D Positions="-100,100,0 -100,-100,0 100,-100,0 100,100,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>
                        <Rectangle Width="50" Height="50" Fill="#1794A5"/>
                    </Viewport2DVisual3D.Visual>
                </Viewport2DVisual3D>
                <!--背面-->
                <Viewport2DVisual3D>
                    <Viewport2DVisual3D.Geometry>
                        <MeshGeometry3D Positions="100,100,0 100,-100,0 -100,-100,0 -100,100,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>
                        <Rectangle Width="50" Height="50" Fill="#1794A5"/>
                    </Viewport2DVisual3D.Visual>
                </Viewport2DVisual3D>
                <!--绕X、Y轴旋转-->
                <ContainerUIElement3D.Transform>
                    <Transform3DGroup>
                        <RotateTransform3D>
                            <RotateTransform3D.Rotation>
                                <AxisAngleRotation3D x:Name="axisX" Axis="1,0,0" Angle="0"/>
                            </RotateTransform3D.Rotation>
                        </RotateTransform3D>
                        <RotateTransform3D>
                            <RotateTransform3D.Rotation>
                                <AxisAngleRotation3D x:Name="axisY" Axis="0,1,0" Angle="0"/>
                            </RotateTransform3D.Rotation>
                        </RotateTransform3D>
                    </Transform3DGroup>
                </ContainerUIElement3D.Transform>
            </ContainerUIElement3D>
            <!--灯光-->
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <DirectionalLight Color="Transparent"/>
                </ModelVisual3D.Content>
            </ModelVisual3D>
        </Viewport3D.Children>
    </Viewport3D>
    
    <Label Content="Loading"
           FontSize="20"
           FontFamily="Times New Roman"
           Foreground="#ED5485"
           FontWeight="Bold"
           Width="200"
           HorizontalContentAlignment="Center"
           VerticalAlignment="Bottom"
           Margin="0,30"/>
</Grid>

原文链接: https://blog.csdn.net/pandawangyt/article/details/119840279#comments_21734831

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: WPF编程宝典是一本由CSDN(全球最大的文IT社区)出版的帮助读者学习和掌握WPF(Windows Presentation Foundation)编程技术的书籍。WPF是一种基于.NET框架的、用于创建富客户端应用程序的技术。 该书的目的是向读者介绍WPF的基本概念、核心特性和高级编程技巧,并通过大量的示例代码和实战案例来帮助读者深入理解和应用WPF。书涵盖了WPF的各个方面,包括界面设计、自定义控件、数据绑定、动画效果、布局管理、响应式编程等内容。 WPF编程宝典的作者是一些经验丰富的软件开发者和WPF专家,他们从实际开发经验出发,结合自己对WPF的深入研究和理解,将复杂的技术问题用简明易懂的语言解释,帮助读者克服各种编程难题。 在这本书,读者将学习如何使用WPF创建现代化、漂亮的用户界面;如何利用WPF的强大功能实现数据绑定、命令绑定、样式和模板等高级特性;如何使用WPF动画效果和视觉效果提升用户体验;如何通过WPF实现自定义控件和自定义布局管理器等等。 总之,WPF编程宝典是一本权威的、实用的WPF编程指导书籍,适合各类软件开发者以及对WPF技术感兴趣的读者阅读和学习。通过阅读该书,读者能够系统地学习和掌握WPF编程技术,提升自己的软件开发能力。 ### 回答2: WPF编程宝典是CSDN上一本非常受欢迎的教程书籍,它是一个面向WPF编程的指南。WPF编程宝典提供了以实例为基础的教学方式,通过逐步引导读者完成一系列的编程实践,帮助读者理解和掌握WPF框架的核心概念和编程技巧。 WPF编程宝典主要分为几个部分,首先介绍了WPF框架与XAML语言的基础知识,包括界面布局、数据绑定和资源管理等内容。然后深入探讨WPF的控件和自定义控件的创建及使用方法,以及动画、转换和样式的应用。此外,WPF编程宝典还详细介绍了WPF的命令模型、MVVM设计模式和异步编程等高级主题,帮助读者构建更加灵活和可扩展的WPF应用程序。 通过阅读WPF编程宝典,读者可以学习到使用WPF开发各种桌面应用程序的基本技能,无论是普通的应用程序还是图形化的数据展示应用程序。该书详细且有条理的内容安排,适合从初学者到有一定WPF经验的开发人员使用。此外,WPF编程宝典还提供了丰富的实例代码和示例项目,读者可以通过实践来加深对WPF编程的理解和应用。 总之,WPF编程宝典是CSDN上的一本权威教程书籍,对于想要学习和掌握WPF编程的开发人员来说是一本不可或缺的指南。无论是从基础知识到高级技术,该书都能为读者提供全面和系统的学习资源,帮助他们成为熟练的WPF开发者。 ### 回答3: WPF编程宝典是一本由CSDN出版社出版的WPF技术书籍。该书主要面向想要学习和掌握WPF编程的开发者和爱好者。WPF(Windows Presentation Foundation)是微软推出的一种用于创建用户界面的技术,它提供了丰富的视觉效果和交互方式。 这本书涵盖了WPF的各个方面,从基本概念到高级特性都有涉及。首先,它介绍了WPF的基本原理、架构和工作原理,帮助读者建立对WPF的整体认识。然后,书详细介绍了WPF的控件库、布局方式和样式模板的应用,这些对于开发各种类型的用户界面非常重要。 此外,WPF编程宝典还讲解了WPF的数据绑定、命令系统和MVVM(Model-View-ViewModel)模式,让读者能够更加高效地处理数据和用户交互。书还提供了大量的实例代码和工程案例,帮助读者通过实践学习和掌握WPF编程技巧。 总的来说,WPF编程宝典是一本全面而权威的WPF技术书籍,适合那些想要深入学习WPF的开发者和爱好者阅读。通过阅读该书,读者可以系统地学习WPF的各个方面,掌握WPF编程的核心概念和技巧,从而能够更好地开发出现代化、美观和高效的用户界面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值