首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >长线不能正确渲染

长线不能正确渲染
EN

Stack Overflow用户
提问于 2012-02-04 14:23:10
回答 2查看 822关注 0票数 0

我有一个带有画布的项目,用户可以使用鼠标进行缩放和平移。原点用穿过画布的蓝色十字标记。当用户放大时,标记的线宽被减小以使它们在屏幕上保持大约1个像素宽。但是,放大约10倍后,原始线突然消失。在应用缩放转换之前,渲染引擎似乎决定这条线太小而无法显示。

奇怪的是,当我对矩形而不是对直线执行相同的操作时,我得到了预期的行为(请参阅下面代码中的ScaleBox rectangle对象)。任何关于导致问题的原因和如何解决问题的想法都将是受欢迎的。

下面是相关的XAML:

代码语言:javascript
复制
    <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>

和后面的代码:

代码语言:javascript
复制
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倍缩放的截图。原始线突然消失了,但黑匣子仍然像预期的那样出现。(请注意,只有黑盒的一侧可见,因为由于缩放,其余部分在可见区域之外。)

编辑:我解决了这个问题,如下所示

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-04 23:03:25

问题是队伍太长了。如果我动态地减少原始线的长度,使它们与画布的长度大致相同,则所有内容都会按预期显示。如果这条线比画布长100倍左右,它们就会突然消失。这可能是由于某些舍入误差或优化方案造成的。

票数 0
EN

Stack Overflow用户

发布于 2012-02-04 17:42:27

我不太明白为什么你要把这些十字准线放在转换后的画布上。

而不是将它们绘制到转换的画布中,并在每次转换时固定它们的有效线宽,您应该简单地将它们放在另一个未转换的画布中,例如,在这里的父画布中:

代码语言:javascript
复制
<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.TransformGeometry,如下例所示。请注意,转换被定义为静态资源(具有关键的GlobalTransform),以便可以由多个几何重用。

代码语言:javascript
复制
<Path Stroke="Blue">
    <Path.Data>
        <LineGeometry StartPoint="0,-100" EndPoint="0,100" Transform="{StaticResource GlobalTransform}"/>
    </Path.Data>
</Path>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9138891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档