WPF路径以某种大小消失

时间:2019-02-11 10:45:55

标签: 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>

这是其背后的代码

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;
    }

当我将滑块从0拖动到249999时,没问题。我可以在视图上看到线。但是此刻,滑块的值变成250000 –线消失了。

WPF有任何限制吗?

4 个答案:

答案 0 :(得分:2)

由于某种原因,基础算法(可以是Direct2D或它的祖先)考虑比率StrokeThickness / Geometry的范围,并确定笔划在某个点(1 vs 125000)不可见。在另一个问题中,这里也有所提及:WPF DrawGeometry does not draw stroke

但是笔触是画笔,因此您可以使用自定义画笔来欺骗这样的系统,例如在这种情况下:

// use pen size instead of StrokeThickness
var geo = new GeometryDrawing(null, new Pen(Brushes.Black, 2), 
              new RectangleGeometry(new Rect(0, 0, e.NewValue, 1))); // use desired width for the geometry
var brush = new DrawingBrush(geo);
brush.Stretch = Stretch.None; // use this brush size, don't stretch to stroke thickness
brush.Freeze();
MyPath.Stroke = brush;

// choose a big number (more than desired thickness * 125000) to fool WPF or its friends
MyPath.StrokeThickness = 1000;

答案 1 :(得分:0)

我认为WPF没有任何限制。对我来说,它看起来像是WPF渲染错误。

我只能提供一种解决方法,但是我不知道为什么 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;
}

答案 2 :(得分:0)

非常令人兴奋的问题,我想这一定是一个错误。 如果您按以下方式更改了pointA:

var pointA = new Point(1, 200);

然后它将起作用... :-)

答案 3 :(得分:0)

这似乎与以下Horizontal or vertical WPF Lines limited to 125,000 pixels?

中描述的问题有关

在WPF中,与图形的呈现方式有关的最大长度与笔划宽度与长度之比-可能由图形呈现所决定。 笔触宽度变化,可以观察到以下情况:

  • 如果笔划宽度为1:允许的最大长度为125,000
  • 如果 笔划宽度为2:允许的最大长度为250,000
  • 如果笔划宽度为3:允许的最大长度为375,000