gpt4 book ai didi

c# - 如何在不在 WPF 中创建新的 RotateTransform 的情况下在另一个线程中旋转矩形?

转载 作者:太空宇宙 更新时间:2023-11-03 22:56:11 24 4
gpt4 key购买 nike

我为实时 PPI 显示器开发了一个 WPF 应用程序。我想在 Animator Thread() 中旋转一个名为“hand”的矩形。

public unsafe void Animator_Thread()
{
RotateTransform rotateTransform = new RotateTransform(ins_angle);
while (true)
{
this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal,
new Action(delegate()
{
//update hand angle
rotateTransform.Angle = ins_angle ;
hand.RenderTransform = rotateTransform;
//hand.RenderTransform = new RotateTransform(ins_angle);

//update Bitmap
image1.Source = BitmapSource.Create(width, height,
dpiX,dpiY,pixelFormat,myPalette,Image_Buff,stride); }));
}
}

但是当我运行线程时出现这个错误:(

The calling thread cannot access this object because a different thread owns it.

当我使用注释行时

//hand.RenderTransform = new RotateTransform(ins_angle);

代替

rotateTransform.Angle = ins_angle ;
hand.RenderTransform = rotateTransform;

它有效。但我不想在每个循环中都创建新的 RotateTransform,因为这很耗时。我该如何处理这个问题?

编辑:我是 C# 编程的初学者。我不断地从局域网接收数据。为了处理和显示这些数据,我使用多线程,例如 #数据采集线程 #rotate PPI 指针(与时钟指针相同)并更新显示器位图线程。我在 figure 计算了此操作的不同时间.我想在不到 5 毫秒的时间内完成这些工作。但有时这一行“hand.RenderTransform = new RotateTransform(ins_angle);”一个人消逝的时间更长。

最后是我的问题有什么方法可以比我更快地旋转物体吗?有什么方法可以比我更快地创建位图吗?谢天谢地。

最佳答案

你的问题不是很清楚。但是您既不需要循环也不需要线程来为 UI 元素的 RenderTransform 设置动画。

只需像下面的示例一样使用内置动画,它会以 360°/s 的速度连续为 RotateTransform 的 Angle 属性设置动画。

var rotateTransform = new RotateTransform();
hand.RenderTransform = rotateTransform;
hand.RenderTransformOrigin = new Point(0.5, 0.5);

rotateTransform.BeginAnimation(
RotateTransform.AngleProperty,
new DoubleAnimation
{
By = 360,
Duration = TimeSpan.FromSeconds(1),
RepeatBehavior = RepeatBehavior.Forever
});

编辑:如果您只是在后台线程中收到一些位置数据,您需要做的就是在 Dispatcher 操作中更新现有 RotateTransform 的 Angle 属性。

前提是 RenderTransform 已经包含一个 RotateTransform,它之前在 UI 线程中分配过一次:

hand.Dispatcher.Invoke(() => ((RotateTransform)hand.RenderTransform).Angle = ins_angle);

如果您想动画元素到新位置:

hand.Dispatcher.Invoke(() =>
{
hand.RenderTransform.BeginAnimation(
RotateTransform.AngleProperty,
new DoubleAnimation(ins_angle, TimeSpan.FromSeconds(1)));
});

关于c# - 如何在不在 WPF 中创建新的 RotateTransform 的情况下在另一个线程中旋转矩形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45259451/

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