我目前正在编写包含费率的WPF进度条(请参阅Windows 8 - Fancy Progress Bars API?)。
下面的屏幕截图显示了我到目前为止所做的事情(左)以及作为我学习练习(右)的一部分,所有代码都做得很糟糕。我现在正在尝试将代码版本转换为尽可能多地使用XAML。
通过创建一个名为RateBase的新类并以与RangeBase类似的方式实现它,我已经完成了大部分工作。然后我添加了一个新实例并提供了一个模板文件RangeGraph。我试图尽可能地通过这本书来做到这一点,但我不确定如何解决最后阶段。
我现在想添加一个图表,这个图表用于显示随着进度的进展历史变化的速率。我将'Rate'作为我可以绑定的值,但我相信我需要一个包含我的历史汇率值的Double []。我的问题是应该放在哪里(我真的不想污染RateBase)以及如何从我的模板中绑定它(如果我在那里添加属性,我不相信我可以绑定到RangeGraph.cs我错了?)
答案 0 :(得分:1)
你是对的,你需要历史数据。在我看来,每当绑定的依赖项属性Rate
发生变化时,您应该将旧值移动到在图形控件本身(具有DP的相同位置)上定义的IEnumerable中,并使用它来绘制线条。我个人会创建一个名为MyControlData的类,并将其实例添加到控件中。
你可能还想添加一个Timer
并将当前的速率移动到IEnumerable,因为相同速率的较长条纹将显示为多个条形。取决于您实际如何确定进度。您可能会遇到以下困境:Rate
在大多数情况下以不同于Percentage
的间隔进行更改 - 您的船上会浮动什么?
将历史记录保存在您的控件范围内会使您的应用程序与您的速率历史记录无关,但让您的控件根据需要显示它。
要在UserControl中使用DataBinding,请编辑Control.xaml中的<UserControl x:Name="myControl">
节点,并添加如此处所示的名称。无论您想绑定哪个,请参阅ElementName=myControl
。请注意,如果要实现此目的,则必须在Control(或MyControlData)上实现INotifyPropertyChanged - 或者,这是可取的,直接将其实现为依赖属性。
顺便说一下,如果你不知道如何实现你想要查看ItemsControl
的内容。我认为您可以通过使用ItemsControl
和ItemsTemplate
这样简单的方式轻松实现您想要做的事情,其中ItemsSource是您的历史数据,而ItemTemplate则描述您与MaxRate相比的当前费率。 MaxRate是您可以从DependencyProperty Rate
更改的处理程序设置的另一个属性。