我有一个带有画布的项目,用户可以使用鼠标进行缩放和平移。原点标有穿过画布的蓝色十字。当用户放大时,标记的线宽减小,以使它们在屏幕上保持约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
以下是一切正常的截图。
以下是10x Zoom的截图。原点线突然消失,但黑匣子仍然按预期显示。 (请注意,只有黑匣子的一侧可见,因为缩放后其余部分位于可见区域之外。)
编辑:我想出了问题,见下文
答案 0 :(得分:1)
我不太明白为什么你会将这些十字准线放在变换后的Canvas中。
不是将它们绘制到转换后的画布中并在转换的每次更改时修复它们的有效线宽,而应将它们简单地放在另一个未转换的画布中,例如,在父Canvas中:
<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并使用适当的Geometry.Transform ,如下例所示。请注意,转换定义为静态资源(使用键GlobalTransform
),因此in可以由多个几何重用。
<Path Stroke="Blue">
<Path.Data>
<LineGeometry StartPoint="0,-100" EndPoint="0,100" Transform="{StaticResource GlobalTransform}"/>
</Path.Data>
</Path>
答案 1 :(得分:0)
问题是线路太长了。如果我动态减少原始线的长度,使它们与画布的长度大致相同,则所有内容都会按预期显示。如果线条比画布长100倍左右,它们会突然消失。这可能是由于某些舍入错误或优化方案造成的。