c# - WPF 路径以某种大小消失

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

当我将 slider 从 0 拖动到 249999 时,一切正常。我可以在我的 View 中看到线条。但就在此时, slider 的值变成了 250000——线条消失了。

WPF 有什么限制吗?

最佳答案

出于某种原因,底层算法(可能是 Direct2D 或其祖先)考虑比率 StrokeThickness/Geometry 范围并决定笔划在某个点(1 对 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;

关于c# - WPF 路径以某种大小消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54628799/

相关文章:

c# - 在 asp.net c# 4.0 中完全以编程方式创建 Gridview

c# - 在用户看到之前在另一个线程中缓存图像

c# - 绑定(bind)到列表的计数,其中 Typeof

c# - 将重复的选择合并为一个结果

c# - 在 WPF 应用程序中执行 INSERT 查询时 SqlCommand 方法错误

c# - 如何在 WinForms 中绘制图像反射?

c# - 允许 .htm 快捷方式的 OpenFileDialog xml 过滤器

C# - 静态类、私有(private)构造函数、抽象类 - 都阻止实例创建 - 使用哪一个?

c# - 通过 MAPI32 将 HTML 嵌入到电子邮件中

c# - TFS C# - 加载 workItemStore 返回 null 或类型初始值设定项异常