我有一个 WPF 应用程序,其中仅在调整应用程序窗口大小时才显示线条形状,如下所示:
红线是即时绘制的,它没有在 XAML 中定义。它显示正常。
蓝线是在 XAML 中定义的,但它的尺寸在OnRender()
调用中发生了变化。如果其尺寸未更改,或者仅更改了部分尺寸,则在启动时会显示蓝线。但是当蓝线的所有尺寸都改变时,它不会在启动时显示。它仅在应用程序调整大小时显示。
这是 XAML 代码:
<Window x:Class="canvas_line.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:canvas_line"
Title="MainWindow" Height="284" Width="228">
<Canvas Name="canvas">
<local:show_line />
<Line Name="my_line" Stroke="Blue"
X1="50" Y1="40" X2="50" Y2="80" StrokeThickness="4" />
</Canvas>
</Window>
以及 C# 代码隐藏文件:
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
using System.Linq;
namespace canvas_line
{
public partial class show_line: FrameworkElement
{
protected override void OnRender(DrawingContext dc)
{
base.OnRender(dc); // Good practice.
// Draw a brand-new red line defined here only
// (not defined in XAML).
Pen dp = new Pen(Brushes.Red, 4);
dc.DrawLine(dp, new Point(100, 150), new Point(100, 200));
// Now modify coordinates of the blue line defined in XAML.
Canvas cp = (Canvas)this.Parent;
var my_line = cp.Children.OfType<Line>().FirstOrDefault();
my_line.X1 = 100;
my_line.Y1 = 20;
my_line.X2 = 100;
my_line.Y2 = 50;
// Problem: The blue line is not displayed unless
// the application window is resized.
}
}
}
整个项目的 zip 文件在这里(项目中的代码很少,我已将其修剪到演示问题所需的绝对最小值):
https://anonfiles.com/file/18c6edce296927b43ed0b0d595574a80
我尝试了各种对UpdateLayout()
and的调用组合InvalidateVisual()
,但没有效果。为什么会发生这种情况,是否有解决方法?我的最终目标是能够为蓝线设置动画以使其闪烁。
我使用的是 Windows 7、Visual Studio 10、.NET 4.0 客户端配置文件。