XAML绑定UI更新

时间:2012-07-09 06:46:45

标签: c# wpf xaml

如果我将XAML元素绑定到数据源属性并且数据源变化更快,那么人眼可以看到我假设UI也被重新绘制得更快,然后人眼可以看到并浪费资源。对于属性更改而言,提升标志而不是触发重新绘制UI然后定时器以在属性发生更改时触发UI重绘是不是一个好主意?或者我错过了如何重新绘制UI?

3 个答案:

答案 0 :(得分:0)

可以使用延迟调用来提升属性更改事件,也许就像这样......

public static class DispatcherExtensions
{
    private static Dictionary<string, DispatcherTimer> timers =
        new Dictionary<string, DispatcherTimer>();
    private static readonly object syncRoot = new object();

    public static void DelayInvoke(this Dispatcher dispatcher, string namedInvocation,
        Action action, TimeSpan delay,
        DispatcherPriority priority = DispatcherPriority.Normal)
    {
        lock (syncRoot)
        {
            RemoveTimer(namedInvocation);
            var timer = new DispatcherTimer(delay, priority, (s, e) => action(), dispatcher);
            timer.Start();
            timers.Add(namedInvocation, timer);
        }
    }


    public static void CancelNamedInvocation(this Dispatcher dispatcher, string namedInvocation)
    {
        lock (syncRoot)
        {
            RemoveTimer(namedInvocation);
        }
    }

    private static void RemoveTimer(string namedInvocation)
    {
        if (!timers.ContainsKey(namedInvocation)) return;
        timers[namedInvocation].Stop();
        timers.Remove(namedInvocation);
    } 


} 

然后

private object _property;  
public object Property  
{  
    get { return _property; }  
    set  
    {  
        if (_property != value)  
        {  
            _property = value;  
            Dispatcher.DelayInvoke("PropertyChanged_Property",(Action)(() =>
            {
                 RaisePropertyChanged("Property");   
            }),TimeSpan.FromMilliseconds(500));

        }  
    }  
}  

不确定我喜欢它......

答案 1 :(得分:-1)

此案例的典型模式是将您的媒体资源实施为

    private object _property;
    public object Property
    {
        get { return _property; }
        set
        {
            if (_property != value)
            {
                _property = value;
                RaisePropertyChanged("Property");
            }
        }
    }

只有在值发生变化时才会更新您的绑定

答案 2 :(得分:-1)

在这种情况下,触发UI更新的计时器是可行的方法。为了保持UI流畅,需要一个大约40ms的计时器间隔。

public class ViewModel
{
    private Timer updateTimer;
    public ViewModel()
    {
        updateTimer = new Timer();
        updateTimer.Interval = 40;
        updateTimer.Elapsed +=new ElapsedEventHandler(updateTimer_Elapsed);
        updateTimer.Start();
    }

    private object _property;
    public object Property
    {
        get { return _property; }
        set
        {
            if (_property != value)
            {
                _property = value;
            }
        }
    } 

    void  updateTimer_Elapsed(object sender, ElapsedEventArgs e)
    {
        RaisePropertyChanged();
    }
}

在没有参数的情况下调用RaisePropertyChanged()会强制UI刷新所有绑定。如果您不想这样做,可以使用标志或注册表来标记需要更新的属性。