【发布时间】:2012-02-04 06:23:10
【问题描述】:
我有一个带有画布的项目,用户可以使用鼠标进行缩放和平移。原点用穿过画布的蓝色十字标记。当用户放大标记时,标记的线宽会减小,以使它们在屏幕上保持大约 1 个像素宽。然而,在放大大约 10 倍后,原点线突然消失了。在应用缩放变换之前,渲染引擎似乎决定线条太小而无法显示。
奇怪的是,当我对矩形而不是直线执行相同的操作时,我得到了预期的行为(请参阅下面代码中的 ScaleBox 矩形对象)。欢迎任何关于导致问题的原因以及如何解决问题的想法。
这里是相关的 XAML:
<Canvas x:Name="MouseCapture" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="WhiteSmoke" >
<Canvas x:Name="ZoomPan">
<Canvas.RenderTransform >
<MatrixTransform x:Name="_zoomPanTransform" />
</Canvas.RenderTransform>
<Rectangle x:Name="ScaleBox" Width="100" Height="100" Canvas.Left="-50" Canvas.Top="-50" Stroke="Black"/>
<Line x:Name="YOrigin" X1="-5000" X2="5000" Y1="0" Y2="0" Stroke="Blue" />
<Line x:Name="XOrigin" X1="0" X2="0" Y1="-5000" Y2="5000" Stroke="Blue" />
</Canvas>
</Canvas>
以及背后的代码:
Private Sub ZoomControl_PreviewMouseWheel(sender As Object, e As System.Windows.Input.MouseWheelEventArgs) Handles MouseCapture.PreviewMouseWheel
Dim scale As Double
If e.Delta > 0 Then
scale = 0.95
Else
scale = 1 / 0.95
End If
Dim center As Point = e.GetPosition(MouseCapture)
Dim zoom As New ScaleTransform(scale, scale, center.X, center.Y)
_zoomPanTransform.Matrix *= zoom.Value
UpdateLineWidth()
End Sub
Private Sub UpdateLineWidth()
ScaleBox.StrokeThickness = 1 / _zoomPanTransform.Matrix.M11
XOrigin.StrokeThickness = 1 / _zoomPanTransform.Matrix.M11
YOrigin.StrokeThickness = 1 / _zoomPanTransform.Matrix.M11
End Sub
这是一切正常时的屏幕截图。
这是 10 倍缩放的屏幕截图。原点线突然消失了,但黑框仍然按预期显示。 (请注意,只有一侧的黑框是可见的,因为由于缩放,其余的都在可见区域之外。)
编辑:我发现问题见下文
【问题讨论】:
-
你确定你的原点在屏幕上吗?似乎是视而不见。向左平移一点就知道了。
-
@MD.Unicorn 是的,这条线肯定在屏幕上
标签: .net wpf vb.net wpftoolkit