Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF:动画线条减慢用户界面速度_C#_Wpf_Xaml - Fatal编程技术网

C# WPF:动画线条减慢用户界面速度

C# WPF:动画线条减慢用户界面速度,c#,wpf,xaml,C#,Wpf,Xaml,我在UI中画了一条线,每次重新绘制图形时都需要更新它。因为我希望我的UI仍然是响应性的(目前不是这样),所以我使用了一个backgroundworker,它在每次呈现UI时都会被调用。如前所述,当绘制线时,UI变得无响应且缓慢。有什么我可以改变来改进我的软件吗 这就是我正在使用的代码(至少是相关的部分) 我使用的线是由点[]的数组生成的。为了确保没有其他东西会减慢软件的速度,我将行生成简化为仅使用虚拟值: void Worker_DoWork(object sender, DoWorkEvent

我在UI中画了一条线,每次重新绘制图形时都需要更新它。因为我希望我的UI仍然是响应性的(目前不是这样),所以我使用了一个backgroundworker,它在每次呈现UI时都会被调用。如前所述,当绘制线时,UI变得无响应且缓慢。有什么我可以改变来改进我的软件吗

这就是我正在使用的代码(至少是相关的部分)

我使用的线是由点[]的数组生成的。为了确保没有其他东西会减慢软件的速度,我将行生成简化为仅使用虚拟值:

void Worker_DoWork(object sender, DoWorkEventArgs e)
{
    Dispatcher.BeginInvoke((Action)delegate
    {
        Point[] line = new Point[480];

        MySegment1.Points.Clear();
        bool isStart = true;

        for (int i = 0; i < line.Length; i++)
        {
            line[i] = new Point(0, 0);
            if (isStart)
            {
                MyFigure1.StartPoint = line[i];
                isStart = false;
            }
            else
                MySegment1.Points.Add(new Point(i, line[i].Y + 10));
        }
    });
}
void Worker\u DoWork(对象发送方,DoWorkEventArgs e)
{
Dispatcher.BeginInvoke((操作)委托
{
点[]线=新点[480];
MySegment1.Points.Clear();
bool-isStart=true;
for(int i=0;i
该行的XAML如下所示:

<Path Stroke="GreenYellow" StrokeThickness="2" Name="MyPath1"  Grid.Column="1">
    <Path.Data>
        <PathGeometry>
            <PathGeometry.Figures>
                <PathFigureCollection>
                    <PathFigure x:Name="MyFigure1" StartPoint="0,0">
                        <PathFigure.Segments>
                            <PathSegmentCollection>
                                <PolyBezierSegment x:Name="MySegment1"/>
                            </PathSegmentCollection>
                        </PathFigure.Segments>
                    </PathFigure>
                </PathFigureCollection>
            </PathGeometry.Figures>
        </PathGeometry>
    </Path.Data>
</Path>

非常感谢您的推荐


编辑:除了克莱门斯的回答之外,我还将
DispatcherPriority
更改为
System.Windows.Threading.DispatcherPriority.ApplicationIdle
,这也大大增加了UI的责任。我认为这是我目前可以忍受的一种状态……:)

如果不逐点更新PolyBezierSegment,而是创建一个新的
点集合
,并将其分配给PolyBezierSegment的
属性,则无需进行所有这些BackgroundWorker“优化”:

private Random random = new Random(); // creates some sample data

private void CompositionTarget_Rendering(object sender, EventArgs e)
{
    var line = new Point[480];

    for (int i = 0; i < line.Length; i++ )
    {
        line[i] = new Point(i, random.Next(0, 100));
    }

    MyFigure1.StartPoint = line[0];
    MySegment1.Points = new PointCollection(line); // here
}
private Random=new Random();//创建一些示例数据
私有void CompositionTarget_呈现(对象发送方,事件参数e)
{
var线=新点[480];
for(int i=0;i

还请注意,WPF提供了比路径控件中的PathGeometry更高效的图形渲染方法。您可以开始阅读MSDN上的文章。

如果您不逐点更新PolyBezierSegment,而是创建一个新的
点集合
,并将其分配给PolyBezierSegment的
属性,则无需进行所有这些BackgroundWorker“优化”:

private Random random = new Random(); // creates some sample data

private void CompositionTarget_Rendering(object sender, EventArgs e)
{
    var line = new Point[480];

    for (int i = 0; i < line.Length; i++ )
    {
        line[i] = new Point(i, random.Next(0, 100));
    }

    MyFigure1.StartPoint = line[0];
    MySegment1.Points = new PointCollection(line); // here
}
private Random=new Random();//创建一些示例数据
私有void CompositionTarget_呈现(对象发送方,事件参数e)
{
var线=新点[480];
for(int i=0;i

还请注意,WPF提供了比路径控件中的PathGeometry更高效的图形渲染方法。您可以开始阅读MSDN上的文章。

您的后台工作人员正在后台线程上运行worker\u DoWork?对不,你正在使用调度程序在UI线程上运行整个更新算法。您的后台工作人员不会执行jack Shuck操作,除非将该方法排入调度程序。老实说,做你想做的事所需要的技能水平相当高;我建议抛售动画,或者只是买一个控件,它可以按照你需要的方式来做你需要做的事情。谢谢你的诚实意见-需要什么样的技能才能做到这一点?我真的很想自己学习如何实现这一点,而不是买任何东西……首先,我很好地理解了多线程应用程序编程是如何完成的。其次,深入了解如何在WPF中呈现UI。第三,对于动画复杂图形,最必要的是如何通过DX在WPF中编程加速的2d和3d图形。这三者的复杂程度从一开始就非常高,并且呈指数级上升。这就是为什么买总比写好。你的后台工作人员在后台线程上运行worker\u DoWork?对不,你正在使用调度程序在UI线程上运行整个更新算法。您的后台工作人员不会执行jack Shuck操作,除非将该方法排入调度程序。老实说,做你想做的事所需要的技能水平相当高;我建议抛售动画,或者只是买一个控件,它可以按照你需要的方式来做你需要做的事情。谢谢你的诚实意见-需要什么样的技能才能做到这一点?我真的很想自己学习如何实现这一点,而不是买任何东西……首先,我很好地理解了多线程应用程序编程是如何完成的。其次,深入了解如何在WPF中呈现UI。第三,对于动画复杂图形,最必要的是如何通过DX在WPF中编程加速的2d和3d图形。这三者的复杂程度从一开始就非常高,并且呈指数级上升。这就是为什么买总比写好。哇,谢谢。这是一个巨大的推动。谢谢你推荐的文章!哇,谢谢你。这是一个巨大的推动。谢谢你推荐的文章!