gpt4 book ai didi

wpf - 没有 WPF 的 XAML - 动画

转载 作者:行者123 更新时间:2023-12-04 06:12:21 25 4
gpt4 key购买 nike

我正在尝试完全在 WPF 之外使用 XAML,尤其是在 XNA 应用程序中。到目前为止,我已经设法(很容易地,我很惊讶地承认)从 XAML 文件在我的 XNA 应用程序中加载了一些数据。当我决定要为我的类(class)的一个属性设置动画时,问题就开始了……什么也没发生:(

这是我从 XAML 文件加载的主类:

[ContentPropertyAttribute("Animation")]
public class Test : FrameworkContentElement
{
public string Text { get; set; }
public Vector2 Position { get; set; }
public Color Color { get; set; }
public Storyboard Animation { get; set; }

public static DependencyProperty RotationProperty =
DependencyProperty.Register("Rotation", typeof(double), typeof(Test), new PropertyMetadata(0.0));
public double Rotation { get { return (double)GetValue(RotationProperty); } set { SetValue(RotationProperty, value); } }
}

这是 XAML 文件:
<l:Test xmlns:l="clr-namespace:XAMLAndXNA;assembly=XAMLAndXNA"
xmlns:a1="clr-namespace:System.Windows.Media.Animation;assembly=PresentationFramework"
xmlns:a2="clr-namespace:System.Windows.Media.Animation;assembly=PresentationCore"
Text="Testo" Position="55,60" Color="0,255,255,255">
<a1:Storyboard>
<a2:DoubleAnimation a1:Storyboard.TargetProperty="Rotation"
From="0"
To="360"
Duration="00:00:10.0"/>
</a1:Storyboard>
</l:Test>

这是加载和动画启动(尝试):
Test test = XamlReader.Load(new XmlTextReader("SpriteBatchStuff.xaml")) as Test;
test.Animation.Begin(test);

我快要好奇死了:)

最佳答案

尽管 XAML 独立于 WPF,但视觉元素不是。特别是,动画和布局是 WPF 的一部分,取决于存在的 WPF 管道——通过 Application 对象、PresentationSource(如 HwndSource)、XBAP PresentationHost.exe 等。

因此,您可以读取 XAML 并获取带有子 Storyboard 对象的 Test 对象的对象图,但该 Test 对象在放置在 WPF 上下文中之前不会连接到动画或布局引擎。 XAML 为您提供的只是一个愚蠢的内存中对象图:它是 WPF,而不是 XAML,使对象“事件”。

因此,正如 Ben 所说,您可能最终需要自己“插入或刺激”动画。我不知道有关如何执行此操作的任何文档,但是从 Reflector 中的探索来看,关键 API 似乎是 Storyboard.SeekAlignedToLastTick ,其中文档说:

Values are immediately updated to reflect the changes due to SeekAlignedToLastTick, even though the screen does not reflect these changes until the screen updates.



注意第二个子句。通常,随着视觉对象值的变化,WPF 会处理屏幕的更新。如果您不使用 WPF,则由您来读取更改的值并相应地重绘屏幕:您没有 WPF 布局管理器来为您处理它。

最后,请注意,我还没有测试过 SeekAlignedToLastTick 是否可以在没有加载 WPF 管道的环境中工作。听起来应该如此,因为它不在乎是 WPF 还是驱动时钟的用户代码,但我不能做出任何 promise ......尽管我承认你让我感到好奇!

更新:我已经快速完成了,它似乎确实有效。这是在 Windows 窗体中托管动画的演示(在这种情况下使用普通的 Windows 窗体计时器,但在 XNA 中,我猜该框架将为您提供游戏计时器 - 没有尝试,因为我不知道XNA)。假设您有一个带有计时器 (timer1) 和标签 (label1) 的普通 Windows 窗体,并且该项目引用了 WPF 程序集。

首先,我的类(class)的简化版本:
[ContentProperty("Animation")]
public class Fie : DependencyObject
{
public double Test
{
get { return (double)GetValue(TestProperty); }
set { SetValue(TestProperty, value); }
}

public static readonly DependencyProperty TestProperty =
DependencyProperty.Register("Test", typeof(double), typeof(Fie),
new FrameworkPropertyMetadata(0.0));

public Storyboard Animation { get; set; }
}

现在,WPF 代码从 XAML 加载这些婴儿之一并开始动画:
private Fie _f;
private DateTime _startTime;

public Form1()
{
InitializeComponent();

string xaml =
@"<local:Fie xmlns:local=""clr-namespace:AnimationsOutsideWpf;assembly=AnimationsOutsideWpf""
xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""
>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty=""Test""
From=""0""
To=""360""
Duration=""00:00:10.0""/>
</Storyboard>
</local:Fie>";

_f = (Fie)XamlReader.Load(XmlReader.Create(new StringReader(xaml)));
Storyboard.SetTarget(_f.Animation, _f);
_f.Animation.Begin();

_startTime = DateTime.Now;
timer1.Enabled = true;
}

请注意,我必须将 Storyboard的目标设置为我刚刚加载的 XAML 对象。这不会自动发生。我尝试在 XAML 中使用 Storyboard.TargetName 执行此操作,但这似乎不起作用——您可能有更多的运气。

最后几行只是为计时器回调设置:
private void timer1_Tick(object sender, EventArgs e)
{
TimeSpan sinceStart = DateTime.Now - _startTime;
_f.Animation.SeekAlignedToLastTick(sinceStart);

label1.Text = _f.Test.ToString();
}

我已经存储了动画的开始时间,并用它来计算我们进入动画的距离。 WinForms 计时器有点粗糙,但这足以证明概念;毫无疑问,XNA 会有更好的东西。然后我调用 Storyboard.SeekAlignedToLastTick,它更新动画值。没有任何东西自动显示,因为我的 XAML 对象没有连接到显示,但我可以检查它的 Test 属性并验证它确实是动画。实际上,我会使用它来更新 XAML 对象表示的任何 XNA 视觉元素的位置或方向。

关于wpf - 没有 WPF 的 XAML - 动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2387454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com