我有一个带有画布的项目,用户可以使用鼠标进行缩放和平移。原点用穿过画布的蓝色十字标记。当用户放大时,标记的线宽被减小以使它们在屏幕上保持大约1个像素宽。但是,放大约10倍后,原始线突然消失。在应用缩放转换之前,渲染引擎似乎决定这条线太小而无法显示。
奇怪的是,当我对矩形而不是对直线执行相同的操作时,我得到了预期的行为(请参阅下面代码中的ScaleBox rectangle对象)。任何关于导致问题的原因和如何解决问题的想法都将是受欢迎的。
下面是相关的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倍缩放的截图。原始线突然消失了,但黑匣子仍然像预期的那样出现。(请注意,只有黑盒的一侧可见,因为由于缩放,其余部分在可见区域之外。)

编辑:我解决了这个问题,如下所示
发布于 2012-02-04 23:03:25
问题是队伍太长了。如果我动态地减少原始线的长度,使它们与画布的长度大致相同,则所有内容都会按预期显示。如果这条线比画布长100倍左右,它们就会突然消失。这可能是由于某些舍入误差或优化方案造成的。
发布于 2012-02-04 17:42:27
我不太明白为什么你要把这些十字准线放在转换后的画布上。
而不是将它们绘制到转换的画布中,并在每次转换时固定它们的有效线宽,您应该简单地将它们放在另一个未转换的画布中,例如,在这里的父画布中:
<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"/>
</Canvas>
<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>通常,当您想要在保持几何形状笔触粗细的同时变换几何形状时,应该使用Path元素,并将Path.Data设置为具有适当Geometry.Transform的Geometry,如下例所示。请注意,转换被定义为静态资源(具有关键的GlobalTransform),以便可以由多个几何重用。
<Path Stroke="Blue">
<Path.Data>
<LineGeometry StartPoint="0,-100" EndPoint="0,100" Transform="{StaticResource GlobalTransform}"/>
</Path.Data>
</Path>https://stackoverflow.com/questions/9138891
复制相似问题