我在缩放图时遇到了这个问题,这是通过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有任何限制吗?
我认为 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)