MVVM WPF应用程序中的简单动画

| 我有一个带有滑动条的MVVM应用程序,当用户更改滑动条时,它会更新屏幕上的图形并更新一些绘图。当用户更改滑块的位置时,所有这些都有效,我想添加一个\'Play \'按钮,该按钮会自动移动滑块并更新所有内容。我尝试了以下代码来执行此操作,当我尝试执行此操作时,屏幕上没有任何变化。我已经确认它确实在运行代码并更改\'SliderPos \'变量。我想念什么?
private void VSMPlayer()
    {
        SliderPos = 0;
        const int speed = 1;

        while (SliderPos < SliderLength)
        {
            Thread.Sleep(100 / speed);

            SliderPos = SliderPos + 20;
        }

        // todo finish this function
    }
为了清楚起见,这里是SliderPos属性 公共双SliderPos         {             得到             {                 返回this.sliderPos;             }
        set
        {
            this.sliderPos = value;
            SetCursorLocation();
            SetParameters();
            this.RaisePropertyChanged(\"SliderPos\");
        }
    }
    
已邀请:
拥有“ 2”的类需要实现“ 3”。 (如果您的“ѭ4”绑定到该财产) 编辑:仅此一项是行不通的,因为将正确地指出UI线程正在休眠。 您可以尝试这样的方法,它可以工作:
SliderPosition = 0;
DispatcherTimer timer = null;
timer = new DispatcherTimer(TimeSpan.FromSeconds(0.1), DispatcherPriority.Render, delegate
{
    SliderPosition += 20;
    if (SliderPosition > 100) timer.Stop();
},
Dispatcher.CurrentDispatcher);
timer.Start();
Edit2:如果您不修改任何UI线程拥有的控件,则可以使用UI线程之外的任何线程,例如:
SliderPosition = 0;
new Thread(new ThreadStart(delegate
{
    while (SliderPosition < 100)
    {
        Thread.Sleep(100);
        SliderPosition += 20;
    }
})).Start();
    
看一下类似的解决方案: ViewModel:
public class MainVM : INotifyPropertyChanged
{
    public int SliderLength
    {
        get
        {
            return Names.Count - 1;
        }
    }
    private void VSMPlayer()
    {
        SliderPos = 0;
        const int speed = 1;
        while (SliderPos < SliderLength)
        {
            Thread.Sleep(100 / speed);

            SliderPos = SliderPos + 1;
        }
        // todo finish this function
    }
    private bool CanVSMPlayer()
    {
        return Names.Count > 0;
    }
    public ICommand Play
    {
        get
        {
            return new RelayCommand(() =>
            {
                IAsyncResult result = new Action(VSMPlayer).BeginInvoke((c =>
                {
                    //operation completed
                }), null);

            }, CanVSMPlayer);
        }
    }
    public ObservableCollection<string> Names
    {
        get
        {
            return new ObservableCollection<string>() { \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\" };
        }

    }

    int _sliderPos = 0;
    public int SliderPos
    {
        get { return _sliderPos; }
        set
        {
            _sliderPos = value;
            RaisePropertyChanged(\"SliderPos\");
            RaisePropertyChanged(\"ActiveName\");
        }
    }

    public string ActiveName
    {
        get
        {
            if (SliderPos < Names.Count)
            {
                return Names[SliderPos];
            }
            else
            {
                return Names[0];
            }
        }
    }

    void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged == null)
            return;
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}
视图:
<StackPanel>
    <TextBlock Text=\"{Binding ActiveName}\"/>
    <Slider Value=\"{Binding SliderPos}\" Maximum=\"{Binding SliderLength}\"/>
    <Button Content=\"Play\" Command=\"{Binding Play}\"/>
</StackPanel>
    

要回复问题请先登录注册