【问题标题】:How to override the StrokeThickness property of a Line in WPF如何在 WPF 中覆盖 Line 的 StrokeThickness 属性
【发布时间】:2014-03-20 09:05:55
【问题描述】:

这是过去几天一直困扰我的问题。我在Canvas 和Slider 上有10000+ 个Line 对象,我用它们来缩放画布以创建缩放效果。 一切都很好,性能很棒。

唯一困扰我的是StrokeThickness 的Line 也被缩放。我尝试将Bind 和StrokeThickness 设置为滑块值的倒数,以便在移动滑块时获得均匀的厚度。这有效,但大大降低了性能。

有没有其他适合这种情况的方法。无论我将画布缩放多远(如在 CAD 程序中),我都希望线条宽度为零。

【问题讨论】:

  • 你不能把你的Slider移到Canvas之外吗?
  • @Anchit 我的Slider 已经在Canvas 之外了。我使用滑块来缩放Canvas。但是Canvas 上的Line 对象的StrokeThickness 也发生了变化!
  • 在这种情况下,我相信没有直接的方法可以做到这一点。 Check This Link
  • 你用的是ScaleTransform对吧?
  • @Anchit 是的,我正在使用“ScaleTransform”。我想知道 CAD 程序是如何做到这一点的。

标签: c# wpf binding line


【解决方案1】:

对于您想要实现的效果,覆盖 StrokeThickness 并没有任何意义,因为即使 ScaleTransform 更改,它的值实际上仍然保持不变。

您尝试的方法 - Bind StrokeThickness 与滑块值的倒数 - 似乎是最合理的方法。为了提高性能,不要将 StrokeThickness 直接设置为 Slider 值的倒数,而是将其设置为视图模型上的另一个属性。

然后,在滑动完成的情况下,将该属性的值设置为 StrokeThickness 的倒数。

示例 -

private void OnSlidingComplete(object sender, EventArgs e)
{
    LineStrokeThickness = GetInverseOfZoomValue();
}

我知道这并不完全是一个解决方案,而是一种解决方法。

【讨论】:

  • 这不适用于 Slider 的 ValueChanged 事件。只有当我在滑块上松开鼠标后它才会起作用。
  • 这就是我所说的OnSlidingComplete 事件的意思。见这里 - WPF: Slider event that triggers after drag is complete
  • 我想实时查看变化。让我们考虑一下这种可能性,即我使用鼠标滚轮而不是 Slider。
  • 这些更改将是实时的,只是一旦滑块的拖放完成,所有Line 控件似乎都会被标准化。要处理所有情况(如鼠标滚轮、单击滑块、键盘),请参阅this link。
  • 我明白你的意思,问题是当我释放鼠标时,在更新之前会有延迟。我想这是 WPF 中的一个主要警告,即线条的 StrokeThickness 也会被缩放,这使得它不适合 CAD 程序。
猜你喜欢
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
相关资源
最近更新 更多