代码之家  ›  专栏  ›  技术社区  ›  grenade

如何让这个超级事件侦听器平静下来

  •  2
  • grenade  · 技术社区  · 15 年前

    我有一个简单的silverlight工具包 Chart Slider 在同一对照组中。我希望在滑块值更改时更新图表。这应该很简单。我试着绑在绳子上 .ValueChanged 事件,但这似乎太频繁了(例如:滑块仍在运动时多次触发)。我只对滑块停止时的值感兴趣。如果我更新的频率与触发事件的频率一样高,那么性能会非常糟糕。因此,我向 .MouseLeftButtonUp .MouseLeftButtonDown .MouseLeftButtonDown

    我是silverlight的新手,所以我正在寻找对该方法的建设性批评以及可能的解决方案。干杯

    MainPage.xaml.cs:

    using System;
    using System.Collections.Generic;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Controls.DataVisualization.Charting;
    using System.Windows.Input;
    
    namespace ControlledModelView.Media
    {
        public partial class MainPage : UserControl
        {
            readonly Dictionary<KeyValuePair<int, int>, Dictionary<string, double>> data = new Dictionary<KeyValuePair<int, int>, Dictionary<string, double>>();
            readonly Chart chart = new Chart { VerticalAlignment = VerticalAlignment.Top };
            private static bool sliderInMotion = true;
            public MainPage()
            {
                InitializeComponent();
                var rng = new Random();
                for (var i = 0; i < 4; i++)
                    for (var d = -1; d >= -31; d--)
                        data.Add(new KeyValuePair<int, int>(i, d), GetRandomData(rng));
    
                var slider = new Slider { LargeChange = 7, SmallChange = 1, Minimum = -31, Maximum = -1, Value = -1, VerticalAlignment = VerticalAlignment.Bottom };
                slider.ValueChanged += SliderValueChanged;
                slider.MouseLeftButtonUp += SliderRelease;
                slider.MouseLeftButtonDown += SliderLock;
                DrawLineChart(-1);
                LayoutRoot.Children.Add(chart);
                LayoutRoot.Children.Add(slider);
            }
    
            static void SliderLock(object sender, MouseButtonEventArgs e)
            {
                sliderInMotion = true;
            }
    
            static void SliderRelease(object sender, MouseButtonEventArgs e)
            {
                sliderInMotion = false;
            }
    
            void SliderValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
            {
                if(!sliderInMotion)
                    DrawLineChart((int)e.NewValue);
            }
    
            private void DrawLineChart(int day)
            {
                chart.Series.Clear();
                for (var seriesIndex = 0; seriesIndex < 4; seriesIndex++)
                {
                    chart.Series.Add(new LineSeries
                    {
                        ItemsSource = data[new KeyValuePair<int, int>(seriesIndex, day)],
                        DependentValuePath = "Value",
                        IndependentValuePath = "Key",
                        AnimationSequence = AnimationSequence.Simultaneous,
                        Name = "Line" + seriesIndex,
                        Title = "Line" + seriesIndex,
                        IsSelectionEnabled = false,
                        Visibility = Visibility.Visible,
                        IsEnabled = true
                    });
                }
            }
    
            static Dictionary<string, double> GetRandomData(Random rng)
            {
                var data = new Dictionary<string, double>();
                for (var year = 1995; year < DateTime.Now.Year; year ++)
                    data.Add(year.ToString(), 500000 * rng.NextDouble());
                return data;
            }
        }
    }
    

    MainPage.xaml:

    <UserControl x:Class="ControlledModelView.Media.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">
        <Grid x:Name="LayoutRoot" />
    </UserControl>
    
    2 回复  |  直到 15 年前
        1
  •  2
  •   Community CDub    8 年前

    这似乎是RX框架(IObservable)的一个主要示例,如果您能够使用它的话。 其中一个标准示例按坐标列出过滤事件(用于感兴趣区域中的鼠标单击事件)。你可以用这个 谢谢你的样品。

    this question 了解一些细节。了解了 here .

        2
  •  1
  •   Ian    15 年前

    手榴弹,

    我不是silverlight开发人员,虽然可能有更好的方法来完成您正在尝试的工作,但这看起来是一个完全可以接受的解决方案(如果可行的话)。很明显,它的意图是什么。