データ ソース プロパティにバインドされた XAML 要素があり、データ ソースがより速く変化する場合、人間の目は、UI も人間の目よりも速く再描画され、リソースを浪費していると想定しています。プロパティが変更された場合、UI の再描画をトリガーし、UI の再描画をトリガーするタイマーの代わりに、プロパティの変更でフラグを立てることは良い考えでしょうか? または、UI が再描画される方法を見逃していますか?
質問する
1291 次
3 に答える
0
あなたは、おそらくこのように、プロパティ変更イベントを発生させるためのdelyed呼び出しを使用することができます...
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));
}
}
}
私はそれが好きかどうかはわかりませんが...
于 2012-07-09T10:00:55.837 に答える
-1
この場合、UI の更新をトリガーするタイマーが有効です。UI を滑らかに保つには、約 40 ミリ秒のタイマー間隔を取ります。
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 はすべてのバインドを強制的に更新します。これが望ましくない場合は、フラグまたはレジストリを使用して、更新が必要なプロパティをマークできます。
于 2012-07-09T07:01:10.567 に答える
-1
この場合の典型的なパターンは、プロパティを次のように実装することです
private object _property;
public object Property
{
get { return _property; }
set
{
if (_property != value)
{
_property = value;
RaisePropertyChanged("Property");
}
}
}
値が変更された場合にのみバインディングを更新します
于 2012-07-09T06:58:43.157 に答える