获取画布高度或宽度时程序崩溃

时间:2014-02-27 16:53:11

标签: c# wpf canvas graph

所以我只是想在WPF窗口的画布上绘制x和y轴。我的主窗口中有画布,我的绘制方法有效,但我试图将这个画布放在一个新窗口中,程序崩溃了。 (当在新窗口中时)程序在调用gCanvas.Height或gCanvas.Width时崩溃,但如果我将这些更改为gCanvas.ActualHeight和gCanvas.ActualWidth程序运行,但它不会绘制x和y轴。有没有人知道为什么当画布在我的主窗口但不在我的新窗口时该方法有效,这里是代码:

private void draw()
    {

        Line xAxis = new Line();
        Line yAxis = new Line();


        xAxis.Stroke = System.Windows.Media.Brushes.LightSteelBlue;
        xAxis.X1 = 0;
        xAxis.X2 = gCanvas.Width;
        xAxis.Y1 = (gCanvas.Height / 2);
        xAxis.Y2 = (gCanvas.Height / 2);
        xAxis.HorizontalAlignment = HorizontalAlignment.Left;
        xAxis.VerticalAlignment = VerticalAlignment.Center;
        xAxis.StrokeThickness = 2;


        gCanvas.Children.Add(xAxis);


        yAxis.Stroke = System.Windows.Media.Brushes.LightSteelBlue;
        yAxis.X1 = (gCanvas.Width / 2);
        yAxis.X2 = (gCanvas.Width / 2);
        yAxis.Y1 = 0;
        yAxis.Y2 = gCanvas.Height;
        yAxis.HorizontalAlignment = HorizontalAlignment.Left;
        yAxis.VerticalAlignment = VerticalAlignment.Center;
        yAxis.StrokeThickness = 2;


        gCanvas.Children.Add(yAxis);


    }

这是第二个窗口的XAML

<Window x:Class="Control.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="362" Width="412">
<Grid>
    <Canvas Name="gCanvas" Margin="5" Background="White"/>

</Grid>
</Window>

我打电话给我的绘图功能

public Window1()
    {
        InitializeComponent();
        if (this.IsLoaded)
            draw(); 

    }

1 个答案:

答案 0 :(得分:0)

所以,你的问题是

  

有人知道为什么当画布在我的主窗口但不在我的新窗口中时该方法有效吗?

嗯,不。 是唯一可以知道的人。但是,从您的问题描述中,我可以看出,在您调用gCanvas方法时,您的draw控件尚未呈现。我可以告诉您这是因为Exception调用了gCanvas.Width,因此必须具有Nan非数字的值。

ActualWidth属性不会返回该值,因此这就是原因。由于未绘制形状,因此我可以假设ActualWidth属性返回0。因此,如果是这种情况,则表明您必须过早调用draw方法并且如果您在构造函数中执行此操作,那么 太早了。相反,请处理Window上的FrameworkElement.Loaded Event

public YourWindow()
{
    ...
    Loaded += YourWindow_Loaded;
}

private void YourWindow_Loaded(object sender, RoutedEventArgs e)
{
    draw();
}