RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1216957
Accepted
A B
A B
Asked:2021-12-11 01:21:49 +0000 UTC2021-12-11 01:21:49 +0000 UTC 2021-12-11 01:21:49 +0000 UTC

UserControl wpf的缩放动画

  • 772

当我将鼠标悬停在 UserControl 上时,如何使其放大?而目前的规模呢?

c#
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    EvgeniyZ
    2021-12-11T03:07:07Z2021-12-11T03:07:07Z

    假设我们有这样的标记:

    <Grid Background="Silver" VerticalAlignment="Center" HorizontalAlignment="Center" Width="300" Height="150">
        <Border Background="#FF1D1D1D" >
            <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="45" Text="Привет мир!" Foreground="White"/>
        </Border>
    </Grid>
    

    它很简单,只是Grid以一组颜色居中,其中包含Border也有自己的颜色,好吧,它本身包含一个简单的颜色,TextBlock也位于中心并且具有“大”字号。我们的任务是Border让它更小一点,并在鼠标事件上对其进行动画处理。

    缩放

    对于各种带有比例的操作,在 XAML 中负责RenderTransform,即比例,这是ScaleTransform. 让我们将其应用于上面的标记:

    <Grid Background="Silver" VerticalAlignment="Center" HorizontalAlignment="Center" Width="300" Height="150">
        <Border Background="#FF1D1D1D" >
            <Border.RenderTransform>
                <ScaleTransform ScaleX=".5" ScaleY=".5"/>
            </Border.RenderTransform>
            <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="45" Text="Привет мир!" Foreground="White"/>
        </Border>
    </Grid>
    

    我们将得到的结果是:

    等级 1

    如您所见,内部Border的比例发生了变化,但不在中心。为了解决这个问题,我们需要移动中心点,并且属性负责 this RenderTransformOrigin,将我们Border的 ' this 属性设置为一个值0.5 0.5,看看我们需要什么:

    等级 2

    触发器

    现在让我们弄清楚如何在 XAML 中处理“将鼠标悬停”在所需对象上。
    这里一切都很简单,用于与事件交互、捕获属性更改等等,所有这些都有触发器,其中只有 4 个:

    姓名 描述
    Trigger(属性触发) 监视属性值的最简单触发器,如果​​它与指定的值匹配,则执行指定的操作。
    DataTrigger(数据触发) 它的用途与前一个类似,但不同之处在于它支持绑定,因此我们可以跟踪 ViewModel 层的属性。
    MultiTrigger(多触发) 允许您使用Conditions.
    EventTrigger(事件触发) 他已经监控了我们的元素发出了什么事件。假设单击按钮或鼠标悬停。

    基于此,您可以创建控件更改颜色、启动动画或其他内容的任何条件。在您的任务中出现“鼠标悬停”,这意味着我们需要EventTrigger. 让我们通过添加触发器来完成上面的示例:

    <Grid Background="Silver" VerticalAlignment="Center" HorizontalAlignment="Center" Width="300" Height="150">
        <Border Background="#FF1D1D1D" RenderTransformOrigin="0.5 0.5" >
            <Border.RenderTransform>
                <ScaleTransform ScaleX=".5" ScaleY=".5"/>
            </Border.RenderTransform>
            <Border.Triggers>
                <EventTrigger RoutedEvent="MouseEnter" >
    
                </EventTrigger>
            </Border.Triggers>
            <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="45" Text="Привет мир!" Foreground="White"/>
        </Border>
    </Grid>
    

    在这里,我们将其视为一个事件MouseEnter——当我们将鼠标移到对象上时会发生此事件。

    动画

    我们现在的任务是对 y 的值进行动画处理ScaleTransform,即ScaleX和ScaleY,这样做是这样的:

    <BeginStoryboard>
        <Storyboard>
            <DoubleAnimation Storyboard.TargetProperty="RenderTransform.ScaleX" To="1" Duration="0:0:.4">
                <DoubleAnimation.EasingFunction>
                    <QuarticEase />
                </DoubleAnimation.EasingFunction>
            </DoubleAnimation>
            <DoubleAnimation Storyboard.TargetProperty="RenderTransform.ScaleY" To="1" Duration="0:0:.4" >
                <DoubleAnimation.EasingFunction>
                    <QuarticEase />
                </DoubleAnimation.EasingFunction>
            </DoubleAnimation>
        </Storyboard>
    </BeginStoryboard>
    

    我解释:

    • 首先,我们创建一个BeginStoryboard负责动画的基本元素。
    • 接下来,我们使用Storyboard. 如果按字面翻译,那么我认为很明显这是一个“故事板”。
    • 在内部,我们可以逐帧动画我们需要的任何东西,但是 WPF 有许多现成的对象可以完美地动画我们需要的属性。对于我们需要的属性,需要动画DoubleAnimation(因为类型的值double)。我们问她:
      • Storyboard.TargetProperty- 动画目标(我们的属性ScaleX或ScaleY)
      • To- 动画将顺利达到什么值。
      • From- 这里我们不设置,因为我们需要动画“从当前到想要的”,如果我们设置了,就是“从指定到想要的”,会导致动画跳动。
      • Duration- 这个动画应该持续多久。
      • 在这里也值得一提EasingFunction——它们可以让动画更流畅,例如,在开始时加速,在结束时慢慢减速。例如,您可以在此处阅读有关它们的信息。

    我还认为您注意到这里同时设置了两个属性,Storyboard正如我在上面所说的,这是一组帧,您可以轻松地在其中设置其中的几个!

    现在让我们把它们放在一起,看看结果:

    <Grid Background="Silver" VerticalAlignment="Center" HorizontalAlignment="Center" Width="300" Height="150">
        <Border Background="#FF1D1D1D" RenderTransformOrigin="0.5 0.5" >
            <Border.RenderTransform>
                <ScaleTransform ScaleX=".5" ScaleY=".5"/>
            </Border.RenderTransform>
            <Border.Triggers>
                <EventTrigger RoutedEvent="MouseEnter" >
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="RenderTransform.ScaleX" To="1" Duration="0:0:.4">
                                <DoubleAnimation.EasingFunction>
                                    <QuarticEase />
                                </DoubleAnimation.EasingFunction>
                            </DoubleAnimation>
                            <DoubleAnimation Storyboard.TargetProperty="RenderTransform.ScaleY" To="1" Duration="0:0:.4" >
                                <DoubleAnimation.EasingFunction>
                                    <QuarticEase />
                                </DoubleAnimation.EasingFunction>
                            </DoubleAnimation>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Border.Triggers>
            <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="45" Text="Привет мир!" Foreground="White"/>
        </Border>
    </Grid>
    

    动画结果

    实际上,这是完成的缩放动画,它仍然只是做同样的事情,但方向相反,我已经认为你可以自己做。

    • 7

相关问题

  • 使用嵌套类导出 xml 文件

  • 分层数据模板 [WPF]

  • 如何在 WPF 中为 ListView 手动创建列?

  • 在 2D 空间中,Collider 2D 挂在玩家身上,它对敌人的重量相同,我需要它这样当它们碰撞时,它们不会飞向不同的方向。统一

  • 如何在 c# 中使用 python 神经网络来创建语音合成?

  • 如何知道类中的方法是否属于接口?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5