0

データ ソース プロパティにバインドされた XAML 要素があり、データ ソースがより速く変化する場合、人間の目は、UI も人間の目よりも速く再描画され、リソースを浪費していると想定しています。プロパティが変更された場合、UI の再描画をトリガーし、UI の再描画をトリガーするタイマーの代わりに、プロパティの変更でフラグを立てることは良い考えでしょうか? または、UI が再描画される方法を見逃していますか?

4

3 に答える 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 に答える