WPF路径以某种尺寸消失

mli*_*mli 18 c# wpf

我在缩放图时遇到了这个问题,这是通过GIS控件Greatmap绘制的.但是一个简单的实验说服我在WPF中存在更深层次的问题.

考虑简单的WPF应用程序:

这是MainWindow.xaml

<Grid>
    <StackPanel>
        <Slider ValueChanged="Size_Changed" Minimum="0" Maximum="300000"/>
        <TextBox x:Name="Value"></TextBox>
    </StackPanel>
    <Canvas>
        <Path x:Name="MyPath" Stroke="Black" StrokeThickness="2" />
    </Canvas>
</Grid>
Run Code Online (Sandbox Code Playgroud)

这就是它背后的代码

private void Size_Changed(object sender,
        RoutedPropertyChangedEventArgs<double> e)
    {
        if (MyPath == null) return;

        var g = new StreamGeometry();
        using (var s = g.Open())
        {
            var pointA = new Point(0, 200);

            s.BeginFigure(pointA, false, false);

            var pointB = new Point(e.NewValue, 200);

            s.PolyLineTo(new[] {pointB}, true, true);

            Value.Text = $"zoom = {e.NewValue:0.0} ;  pointA = {pointA.X:#,0} ; pointB = {pointB.X:#,0}";
        }

        g.Freeze();

        MyPath.Data = g;
    }
Run Code Online (Sandbox Code Playgroud)

当我将滑块从0拖动到249999时,它没问题.我可以看到我的观点.但是当滑块的值变为250000时 - 线条消失了.

WPF有任何限制吗?

Rek*_*ino 0

我认为 WPF 没有任何限制。对我来说,这看起来像是渲染中的 WPF bug。

我只能提供一个解决方法,但我不知道为什么它会在250000之后导致问题。我不知道这个解决方法是否适用于您的实际情况。这个想法是用来LayoutTransform画一条水平线:

private void Size_Changed(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    if (MyPath == null) return;

    var g = new StreamGeometry();
    using (var s = g.Open())
    {
        var pointA = new Point(0, 200);

        s.BeginFigure(pointA, false, false);

        var pointB = new Point(1, 200);

        s.PolyLineTo(new[] { pointB }, true, true);

        MyPath.LayoutTransform = new ScaleTransform(e.NewValue, 1);

        Value.Text = $"zoom = {e.NewValue:0.0} ;  pointA = {pointA.X:#,0} ; pointB = {pointB.X:#,0}";
    }

    g.Freeze();

    MyPath.Data = g;
}
Run Code Online (Sandbox Code Playgroud)