我在缩放图形时遇到了这个问题,它是通过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有任何限制吗?
答案 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中,与图形的呈现方式有关的最大长度与笔划宽度与长度之比-可能由图形呈现所决定。 笔触宽度变化,可以观察到以下情况: