我正在WPF Canvas 中创建一条折线,假设它会根据模型中发生的计算在点击按钮时更新其位置。我正在使用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>

在我的ViewModel中,我有一个PointCollection属性,用于存储路径点。
private PointCollection _modelPathPoints = new PointCollection();
public PointCollection ModelPathPoints
{
    get { return _modelPathPoints; }
    set
    {
        _modelPathPoints = value;
        NotifyPropertyChanged("ModelPathPoints");
    }
}


public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(info));
    }
}

RunAnalysis方法可以正常工作,我已经使用Consol输出对其进行了测试。我的问题是,当PointCollection中的点更改时, Canvas 没有更改。
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;
}

有人看到这个问题吗?

最佳答案

为了避免想知道Thread.Sleep是否正在干扰UI做事情,为什么不使用click-event,这会使它进行一次明显可见的迭代?

然后,在该属性设置中,您可以验证是否为每次单击分配了该属性,验证了所分配的点的值以及是否发生了PropertyChanged事件。

哦,我假设您的 View 模型实现了INotifyPropertyChanged,并且您要为PropertyChanged事件分配一个实际值,而不是在上面的代码中显示?

让我知道是否有帮助-否则,我将创建一个项目并为您检查。最好。

关于c# - 当PointCollection中发生更改时,更新 “live” WPF Canvas (折线),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19376740/

10-13 09:25