0

我有一个 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 客户端配置文件。

4

1 回答 1

2

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

 <Canvas Name="canvas">
    <Line Name="my_line" Stroke="Blue" X1="50" Y1="40" X2="50" Y2="80" StrokeThickness="4" />
    <local:show_line />
 </Canvas>  
于 2014-06-26T19:35:09.053 回答