【问题标题】:How do I calm down this hyper event listener如何让这个超级事件监听器平静下来
【发布时间】:2010-03-01 16:09:39
【问题描述】:

我在同一个控件中有一个简单的 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>

【问题讨论】:

    标签: c# silverlight silverlight-3.0 event-handling slider


    【解决方案1】:

    如果您能够使用它,这似乎是 RX 框架 (IObservable) 的主要示例。 标准示例之一按坐标列出过滤事件(针对感兴趣区域中的 MouseClick 事件)。您可以将其完全用于您的示例。

    有关详细信息,请参阅this question。得到它here

    【讨论】:

    • Rx 还可以限制事件,因此它们只能触发,例如,每 150 毫秒一次。这为我的一个项目节省了时间。
    【解决方案2】:

    手榴弹,

    我不是 silverlight 开发人员,虽然可能有更好的方法来做你正在尝试的事情,但这看起来是一个完全可以接受的解决方案(如果它有效的话)。它试图做什么非常清楚和明显。

    看到它不起作用,我立即的反应是看看他们是否是一个可能会起作用的 LostFocus 事件,尽管这并不能完全让你到达你想要的地方,因为他们必须取消选择控件.然而,这个思考过程让我想知道不同的控制是否会更好?例如一个数字向上向下,用户可以直接输入他们想要的数字,大多数人不太可能继续点击,所以你会得到更少的更新。

    但这就是“如果你不能解决问题,就改变问题”的整个路线......排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 2023-03-14
      • 2017-07-24
      相关资源
      最近更新 更多