如果我将XAML元素绑定到数据源属性并且数据源变化更快,那么人眼可以看到我假设UI也被重新绘制得更快,然后人眼可以看到并浪费资源。对于属性更改而言,提升标志而不是触发重新绘制UI然后定时器以在属性发生更改时触发UI重绘是不是一个好主意?或者我错过了如何重新绘制UI?
答案 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刷新所有绑定。如果您不想这样做,可以使用标志或注册表来标记需要更新的属性。