Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.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_Canvas_Mvvm - Fatal编程技术网

C# 更新「;“生活”;点集合发生更改时的WPF画布(多段线)

C# 更新「;“生活”;点集合发生更改时的WPF画布(多段线),c#,wpf,xaml,canvas,mvvm,C#,Wpf,Xaml,Canvas,Mvvm,我正在WPF画布中创建一条多段线,当点击按钮时,该多段线将根据模型中发生的计算更新其位置。我使用的是MVVM模式 我的XAML代码: <Grid> <StackPanel> <Button Margin="10" Command="{Binding Path=RunAnalysisCmd}">Rune analysis!</Button> <Canvas> <Poly

我正在WPF画布中创建一条多段线,当点击按钮时,该多段线将根据模型中发生的计算更新其位置。我使用的是MVVM模式

我的XAML代码:

<Grid>
    <StackPanel>
        <Button Margin="10" Command="{Binding Path=RunAnalysisCmd}">Rune analysis!</Button>
        <Canvas>
            <Polyline Points="{Binding ModelPathPoints, UpdateSourceTrigger=PropertyChanged}" Stroke="Blue" StrokeThickness="2"/>
        </Canvas>
    </StackPanel>
</Grid>
RunAnalysis方法在fin中工作,我已经使用Consol输出对其进行了测试。我的问题是,当PointCollection中的点发生变化时,画布没有发生变化

public void RunAnalysis()
{
    double angle = 0;
    for (int i = 0; i < 1000; i=i+10)
    {
        Model.TranslateModelEdgeNodes(i, i);
        Model.RotateModelEdgeNodes(angle);
        angle = angle + 0.1;
        AddModelPointsToPointCollection();
        System.Threading.Thread.Sleep(500);
    }
}

public void AddModelPointsToPointCollection()
{
    //ModelPathPoints.Clear();
    PointCollection modelPathPoints = new PointCollection();
    for (int i = 0; i < Model.ModelEdgeNodes.Count(); i++)
    {
        modelPathPoints.Add(new Point( XXX, XXX )) // Not important what XXX, XXX is
    }
    modelPathPoints.Add(new Point(XXX, XXX )); // Not important what XXX, XXX is
    ModelPathPoints = modelPathPoints;
}
public void RunAnalysis()
{
双角度=0;
对于(int i=0;i<1000;i=i+10)
{
Model.TranslateModelEdgeNodes(i,i);
模型。旋转模型节点(角度);
角度=角度+0.1;
AddModelPointStopPointCollection();
系统.线程.线程.睡眠(500);
}
}
public void addModelPointStopPointCollection()
{
//ModelPathPoints.Clear();
PointCollection modelPathPoints=新的PointCollection();
对于(int i=0;i

有人看到这个问题了吗?

为了避免怀疑Thread.Sleep是否会干扰UI的工作,为什么不使用一个click事件,让它进行一次明显的迭代

在该属性设置中,您可以验证每次单击是否都指定了该属性,验证指定的点的值,以及是否正在发生PropertyChanged事件

哦,我假设您的视图模型实现了INotifyPropertyChanged,并且您正在为PropertyChanged事件指定一个实际值,而您没有在上面的代码中显示该值


让我知道如果这有帮助-如果没有,我会创建一个项目,并检查你这个。最好。

对不起。。这只是我在堆栈溢出上的一个类型错误。它是{Binding ModelPathPoints,…}。在my code中,如果您正在UI线程中运行RunAnalysis:
thread.Sleep(500)
将阻止UI线程。你可以用a代替。我认为这不是问题所在。如果我只是删除了线程。睡眠,一切都是一样的。你还能与窗口交互吗,例如,当你移动或调整窗口大小时,它会被重新绘制吗?克莱门斯的评论是正确的:如果在UI线程上调用
RunAnalysis()
,WPF将没有机会重新绘制窗口,因为UI线程一直被阻塞。因此,您必须在另一个线程上调用该方法,例如使用
BackgroundWorker
public void RunAnalysis()
{
    double angle = 0;
    for (int i = 0; i < 1000; i=i+10)
    {
        Model.TranslateModelEdgeNodes(i, i);
        Model.RotateModelEdgeNodes(angle);
        angle = angle + 0.1;
        AddModelPointsToPointCollection();
        System.Threading.Thread.Sleep(500);
    }
}

public void AddModelPointsToPointCollection()
{
    //ModelPathPoints.Clear();
    PointCollection modelPathPoints = new PointCollection();
    for (int i = 0; i < Model.ModelEdgeNodes.Count(); i++)
    {
        modelPathPoints.Add(new Point( XXX, XXX )) // Not important what XXX, XXX is
    }
    modelPathPoints.Add(new Point(XXX, XXX )); // Not important what XXX, XXX is
    ModelPathPoints = modelPathPoints;
}