我在同一个控件中有一个简单的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>
答案 0 :(得分:2)
这似乎是RX框架(IObservable)的一个主要示例,如果您能够使用它。 其中一个标准样本按坐标(对于感兴趣区域中的MouseClick事件)列出过滤事件。您可以将完全用于您的样本。
有关详细信息,请参阅this question。得到它here。
答案 1 :(得分:1)
手榴弹,
我不是一个Silverlight开发人员,虽然可能有更好的方法来做你正在尝试的事情,但这看起来是一个完全可以接受的解决方案(如果它有效)。这是非常清楚和明显的,它正在尝试做什么。
看到它不起作用,我立刻的反应是看看它们是否是一个可能有效的LostFocus事件,虽然这并不能让你到达你想要的位置,因为它们必须取消选择控件。然而,这个思维过程让我想知道一个不同的控制是否可能更好?例如数字向上,用户可以直接输入他们想要的号码,大多数都不太可能继续点击,因此您可以获得更少的更新。
但是,如果你无法解决问题,改变问题,那就是整个过程......排序......排序。