gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:50:47 24 4
gpt4 key购买 nike

我在缩放图形时遇到了这个问题,该图形是通过 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com