C# 更新「;“生活”;点集合发生更改时的WPF画布(多段线)
我正在WPF画布中创建一条多段线,当点击按钮时,该多段线将根据模型中发生的计算更新其位置。我使用的是MVVM模式 我的XAML代码: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
<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;
}