线路在启动时不显示,但在调整大小(WPF)时可见

时间:2014-06-26 19:18:34

标签: c# wpf frameworkelement drawingcontext onrender

我有一个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()InvalidateVisual()的各种调用组合,但没效果。为什么会发生这种情况,是否有解决方法?我的最终目标是能够为蓝线设置动画以使其闪烁。

我使用的是Windows 7,Visual Studio 10,.NET 4.0 Client Profile。

1 个答案:

答案 0 :(得分:2)

如果你这样说它会正确绘制

 <Canvas Name="canvas">
    <Line Name="my_line" Stroke="Blue" X1="50" Y1="40" X2="50" Y2="80" StrokeThickness="4" />
    <local:show_line />
 </Canvas>