- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑:项目可以从here下载.
我正在使用 WPF Storyboard 为地球旋转制作动画,我希望能够在用户单击按钮时将旋转从顺时针方向反转为逆时针方向(反之亦然),尽管实际上这永远不会发生。
在我的 XAML 文件中,我声明了 21 个位图图像(第一个和最后一个是相同的)和 2 个 Storyboard,一个用于顺时针旋转,另一个用于逆时针旋转。
<Window x:Class="StackOverflowWPF.StoryboardSeekWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="StoryboardSeekWindow" Height="400" Width="400">
<Window.Resources>
<BitmapImage x:Key="RotationImage0" UriSource="Images\rotation\0.png"/>
<BitmapImage x:Key="RotationImage1" UriSource="Images\rotation\1.png"/>
<BitmapImage x:Key="RotationImage2" UriSource="Images\rotation\2.png"/>
<BitmapImage x:Key="RotationImage3" UriSource="Images\rotation\3.png"/>
<BitmapImage x:Key="RotationImage4" UriSource="Images\rotation\4.png"/>
<BitmapImage x:Key="RotationImage5" UriSource="Images\rotation\5.png"/>
<BitmapImage x:Key="RotationImage6" UriSource="Images\rotation\6.png"/>
<BitmapImage x:Key="RotationImage7" UriSource="Images\rotation\7.png"/>
<BitmapImage x:Key="RotationImage8" UriSource="Images\rotation\8.png"/>
<BitmapImage x:Key="RotationImage9" UriSource="Images\rotation\9.png"/>
<BitmapImage x:Key="RotationImage10" UriSource="Images\rotation\10.png"/>
<BitmapImage x:Key="RotationImage11" UriSource="Images\rotation\11.png"/>
<BitmapImage x:Key="RotationImage12" UriSource="Images\rotation\12.png"/>
<BitmapImage x:Key="RotationImage13" UriSource="Images\rotation\13.png"/>
<BitmapImage x:Key="RotationImage14" UriSource="Images\rotation\14.png"/>
<BitmapImage x:Key="RotationImage15" UriSource="Images\rotation\15.png"/>
<BitmapImage x:Key="RotationImage16" UriSource="Images\rotation\16.png"/>
<BitmapImage x:Key="RotationImage17" UriSource="Images\rotation\17.png"/>
<BitmapImage x:Key="RotationImage18" UriSource="Images\rotation\18.png"/>
<BitmapImage x:Key="RotationImage19" UriSource="Images\rotation\19.png"/>
<BitmapImage x:Key="RotationImage20" UriSource="Images\rotation\20.png"/>
<Storyboard x:Key="clockwiseStoryboard" RepeatBehavior="Forever">
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="imgRotatingEarth" Storyboard.TargetProperty="Source">
<DiscreteObjectKeyFrame KeyTime="0:0:0.0" Value="{Binding Source={StaticResource RotationImage0}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:0.2" Value="{Binding Source={StaticResource RotationImage1}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:0.4" Value="{Binding Source={StaticResource RotationImage2}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:0.6" Value="{Binding Source={StaticResource RotationImage3}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:0.8" Value="{Binding Source={StaticResource RotationImage4}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:1.0" Value="{Binding Source={StaticResource RotationImage5}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:1.2" Value="{Binding Source={StaticResource RotationImage6}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:1.4" Value="{Binding Source={StaticResource RotationImage7}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:1.6" Value="{Binding Source={StaticResource RotationImage8}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:1.8" Value="{Binding Source={StaticResource RotationImage9}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:2.0" Value="{Binding Source={StaticResource RotationImage10}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:2.2" Value="{Binding Source={StaticResource RotationImage11}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:2.4" Value="{Binding Source={StaticResource RotationImage12}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:2.6" Value="{Binding Source={StaticResource RotationImage13}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:2.8" Value="{Binding Source={StaticResource RotationImage14}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:3.0" Value="{Binding Source={StaticResource RotationImage15}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:3.2" Value="{Binding Source={StaticResource RotationImage16}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:3.4" Value="{Binding Source={StaticResource RotationImage17}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:3.6" Value="{Binding Source={StaticResource RotationImage18}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:3.8" Value="{Binding Source={StaticResource RotationImage19}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:4.0" Value="{Binding Source={StaticResource RotationImage20}}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="counterClockwiseStoryboard" RepeatBehavior="Forever">
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="imgRotatingEarth" Storyboard.TargetProperty="Source">
<DiscreteObjectKeyFrame KeyTime="0:0:0.0" Value="{Binding Source={StaticResource RotationImage20}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:0.2" Value="{Binding Source={StaticResource RotationImage19}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:0.4" Value="{Binding Source={StaticResource RotationImage18}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:0.6" Value="{Binding Source={StaticResource RotationImage17}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:0.8" Value="{Binding Source={StaticResource RotationImage16}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:1.0" Value="{Binding Source={StaticResource RotationImage15}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:1.2" Value="{Binding Source={StaticResource RotationImage14}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:1.4" Value="{Binding Source={StaticResource RotationImage13}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:1.6" Value="{Binding Source={StaticResource RotationImage12}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:1.8" Value="{Binding Source={StaticResource RotationImage11}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:2.0" Value="{Binding Source={StaticResource RotationImage10}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:2.2" Value="{Binding Source={StaticResource RotationImage9}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:2.4" Value="{Binding Source={StaticResource RotationImage8}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:2.6" Value="{Binding Source={StaticResource RotationImage7}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:2.8" Value="{Binding Source={StaticResource RotationImage6}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:3.0" Value="{Binding Source={StaticResource RotationImage5}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:3.2" Value="{Binding Source={StaticResource RotationImage4}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:3.4" Value="{Binding Source={StaticResource RotationImage3}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:3.6" Value="{Binding Source={StaticResource RotationImage2}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:3.8" Value="{Binding Source={StaticResource RotationImage1}}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:4.0" Value="{Binding Source={StaticResource RotationImage0}}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</Window.Resources>
<Grid>
<Image x:Name="imgRotatingEarth" HorizontalAlignment="Center" Margin="50" Stretch="Uniform" />
<Button VerticalAlignment="Bottom" Content="Reverse" Height="30" Width="100" Click="reverseButton_Click" />
</Grid>
还有我的代码隐藏文件
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Windows.Media.Animation;
namespace StackOverflowWPF
{
/// <summary>
/// Interaction logic for StoryboardSeekWindow.xaml
/// </summary>
public partial class StoryboardSeekWindow : Window
{
Storyboard clockwiseStoryboard;
Storyboard counterClockwiseStoryboard;
bool bRotateClockwisely;
TimeSpan duration = new TimeSpan(0, 0, 4);
double dProgress = 0; //the value of dProgress is from 0.0 (begin) to 1.0 (end)
public StoryboardSeekWindow()
{
InitializeComponent();
clockwiseStoryboard = this.FindResource("clockwiseStoryboard") as Storyboard;
counterClockwiseStoryboard = this.FindResource("counterClockwiseStoryboard") as Storyboard;
StartRotation();
}
private void StartRotation()
{
counterClockwiseStoryboard.Begin();
counterClockwiseStoryboard.Pause();
clockwiseStoryboard.Begin();
bRotateClockwisely = true;
}
private void reverseButton_Click(object sender, RoutedEventArgs e)
{
Storyboard sbActive = bRotateClockwisely ? clockwiseStoryboard : counterClockwiseStoryboard;
Storyboard sbPaused = bRotateClockwisely ? counterClockwiseStoryboard : clockwiseStoryboard;
sbActive.Pause();
//I want the other storyboard can seek to where the animation is paused.
dProgress = sbActive.GetCurrentProgress();
dProgress = 1.0 - dProgress;
sbPaused.Seek(new TimeSpan((long)(duration.Ticks * dProgress)));
sbPaused.Resume();
bRotateClockwisely = !bRotateClockwisely;
}
}
}
为了从顺时针模式平滑过渡到逆时针模式,我暂停事件动画并计算我在哪一帧,当恢复反向动画时,我首先寻找该帧。换句话说,我要达到的效果。
0.png->1.png->2.png->3.png->4.png->5.png->用户点击按钮->5.png-> 4.png->3.png->2.png->1.png->0.png->...
但是我的代码不起作用。 Storyboard.Seek() 似乎在工作,但它并没有开始反向旋转。我认为运行 2 个 Storyboard来操作同一个对象可能是错误的。
有人可以帮我修复这些错误,也许可以提供更好的想法来达到同样的效果吗?
最佳答案
你可能在这里用所有这些图像“找错了树”……试试这样的东西怎么样?
<BitmapImage x:Key="RotationImage0" UriSource="Images\rotation\0.png">
<BitmapImage.RenderTransform>
<RotateTransform x:Name="RotateTransform" CenterX="50" CenterY="50" Angle="0" />
</BitmapImage.RenderTransform>
</BitmapImage>
<BitmapImage.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding IsLoading, Mode=OneWay}" Value="True">
<Setter Property="Control.Visibility" Value="Visible" />
<DataTrigger.EnterActions>
<StopStoryboard BeginStoryboardName="ReverseRotationStoryboard" />
<BeginStoryboard Name="RotationStoryboard">
<Storyboard RepeatBehavior="Forever">
<DoubleAnimation Storyboard.TargetProperty="RenderTransform.
(RotateTransform.Angle)" From="0" To="360" Duration="0:0:2.0" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<StopStoryboard BeginStoryboardName="RotationStoryboard" />
<BeginStoryboard Name="ReverseRotationStoryboard">
<Storyboard RepeatBehavior="Forever">
<DoubleAnimation Storyboard.TargetProperty="RenderTransform.
(RotateTransform.Angle)" From="360" To="0" Duration="0:0:2.0" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</BitmapImage.Style>
如果您在动画中需要不同的“步骤”,您可以将上面的 DoubleAnimation
替换为以下内容:
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="RenderTransform.
(RotateTransform.Angle)" Duration="0:0:0.9">
<DiscreteDoubleKeyFrame Value="0" KeyTime="0:0:0" />
<DiscreteDoubleKeyFrame Value="30" KeyTime="0:0:0.075" />
<DiscreteDoubleKeyFrame Value="60" KeyTime="0:0:0.150" />
...
<DiscreteDoubleKeyFrame Value="330" KeyTime="0:0:0.825" />
</DoubleAnimationUsingKeyFrames>
这基本上是通过绑定(bind)到名为 IsLoading
的 Boolean
属性(改编 self 的程序)来实现的。您可以随意调用您的属性,但我们的想法是将其设置为 false
以反转 Animation
的方向。我相信您将能够根据用户的 Click
设置此属性。
请注意 DataTrigger.EnterActions
部分中的 Storyboard
...这发生在属性“变为”true
时。现在查看 DataTrigger.ExitActions
部分中的 Storyboard
...当属性不再为 true
或“变为”假
。
关于c# - 使用 WPF Storyboard从顺时针模式顺利过渡到逆时针模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18269914/
有没有办法在另一个 WPF 窗口内托管 WPF 窗口。我有几个有点复杂的表格。但现在为了简化事情,我试图将其中一些合并为一个“仪表板”表单中的标签页。 请注意,我不是要托管 Windows 窗体,而是
WPF 特有的哪些方面和实践在非 WPF GUI 编程中最有用(并且并非难以实现)? 最佳答案 通过学习 WPF 命令,我了解了命令模式。它构成了 UI - 代码分离的基础,我认为应该在其他应用程序中
WinRT/Metro 正在获得一个新的 SemanticZoom控制,但我很难为 WPF 找到任何东西。 我不想为我的特定项目切换到 Metro,因为它不允许我制作窗口应用程序或跨多个显示器的多个实
我很难解决我的问题,我快要疯了。 想法是这样的:我有两个 ListView 元素,当一个元素从第一个列表掉落到第二个列表时,我需要打开一个对话,但我需要被掉落的元素的信息以及被添加以填充对话的元素。
如果我遵循TabControl,并且一切正常,当我切换到第二个Tabitem时,它显示就没有问题。 //datagrid //datagrid2 但是如果我有这个xaml,当我
在 Windows 窗体应用程序中,我们的数据 GridView 有很多事件,如行鼠标双击或行单击以及额外的...... 但是在 WPF 中我找不到这些事件。我如何将行鼠标双击添加到其中包含数据网格的
在这个项目中,代码 正确编译和执行 ;但是,我需要帮助解决两个问题: VS2012 WPF 设计器不适用于此 XAML 文件。它显示消息设计 View 对于 x64 和 ARM 目标平台不可用。 我收
目前我正在设计 WPF ScrollViewer,我发现了这个 Content="M 0 0 L 4 4 L 0 8 Z" 阅读 MSDN examples .现在我真的很想知道这意味着什么,但我无法
在 WPF 中,元素的可见性可以为“可见”,但实际上在屏幕上不可见,因为它的父元素(或父元素的父元素)具有折叠的可见性。 我希望能够知道一个元素是否实际呈现在屏幕上,而不必遍历可视化树检查父元素。 有
我应该使用 ApplicationCommands.Close用于关闭模式对话框还是该命令被认为是为关闭应用程序保留的?如果是后者,请大家创建Close每个命令 Dialog盒子或只是一个 Close
WPF 是否有任何可用的 piemenu 控件? 最佳答案 我在我的最爱中找到了这个,你可以看看: This 祝你今天过得愉快。 关于wpf - WPF 的菜单,我们在Stack Overflow上找
我正在尝试使用 WrapPanel 和两个 TextBlock 将星号 (*) 附加到某些文本的左侧,允许文本换行,并强制文本右对齐。通过创建一个 FlowDirection 设置为 RightToL
这里是场景(简化):我在Window上有一个控件(比如说一个Rectangle)。我迷上了MouseMove事件,以使其启动拖放操作。然后在MouseDown事件中进行动画处理,向右移动50个像素。但
我有一个 ListView ,它的项目来源是一个列表。我希望用户只选择一项。当我将 listview 的 SelectionMode 设置为 single 时,用户仍然可以选择多个项目,并且似乎 li
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
INotifyPropertyChanged 的目的是什么。我知道每当更改属性时都会触发此事件,但是 View /用户界面如何知道触发了此事件: 这是实现 INotifyPropertyChang
我正在查看工具箱中的 WPF 组件,但找不到 2005/2008 中存在的错误提供程序。 被移除了吗? 最佳答案 ErrorProvider是一个 Winforms 控件。 WPF 中没有等效项。但是
我试图在单击和双击 wpf Image 控件时有不同的行为。不幸的是,单击首先被触发,因此双击被忽略。 最佳答案 如果您改用 MouseDown 事件,则它在 EventArgs 中为 ClickCo
这可能吗? 我使用了一个框架控件并且:显示(例如:showwindow.xaml) 但是我得到这个错误: root element is not valid for navigation 最佳答案 确
我在蓝色背景的窗口上放置了一个扩展器,我想让扩展器的按钮与默认颜色不同(蓝色,它是从窗口接收的)。当我修改扩展器的背景属性时,它会将整个扩展器、标题和全部更改为新颜色。但是,我只想更改按钮本身。谁能指
我是一名优秀的程序员,十分优秀!