Пример #1
0
        // ----------------------------------------------------------------------------------------------
        #region Class functions


        private static void TargetChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var wxthis = (ItemsControl)d;

            if (e.OldValue is IItemsRangeInfo rinfo)
            {
                rinfo.Close();
            }

            var enable = e.NewValue is IItemsRangeInfo || e.NewValue is ISelectionInfo;

            if (enable)
            {
                // Lazy declaration of Timer
                if (Timer == null)
                {
                    Timer       = new DispatcherTimer();
                    Timer.Tick += OnTimerElapsed;
                }

                wxthis.Loaded   += OnLoaded;
                wxthis.Unloaded += OnUnloaded;
            }
            else
            {
                wxthis.Loaded   -= OnLoaded;
                wxthis.Unloaded -= OnUnloaded;
            }

            ScrollViewer wxscroll;

            if (wxthis is ListBox)
            {
                wxscroll = WPF.FindFirstChild <ScrollViewer>(wxthis);
            }
            else
            {
                wxscroll = WPF.FindFirstParent <ScrollViewer>(wxthis);
            }

            if (References == null)
            {
                References = new Dictionary <ScrollViewer, List <WeakReference> >();
            }

            if (References.TryGetValue(wxscroll, out var reflist))
            {
                // Remove dead references
                for (int i = 0; i < reflist.Count; i++)
                {
                    var wref = reflist[i];
                    if (!wref.IsAlive || wref.Target == wxthis)
                    {
                        reflist.RemoveAt(i);
                        i--;
                    }
                }
            }
            else if (enable)
            {
                reflist = new List <WeakReference>();
                References.Add(wxscroll, reflist);
            }

            if (enable)
            {
                reflist.Add(new WeakReference(wxthis));
                if (reflist.Count == 1)
                {
                    wxscroll.ScrollChanged += OnScrollChanged;
                }
            }
            else if (reflist == null || reflist.Count == 0)
            {
                wxscroll.ScrollChanged -= OnScrollChanged;
            }
        }