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

C# 获取画布高度或宽度时程序崩溃,c#,wpf,canvas,graph,C#,Wpf,Canvas,Graph,所以我只是想在WPF窗口的画布上画一个x轴和y轴。我在我的主窗口中有画布,我的绘制方法工作正常,但是我试图将画布放在一个新窗口中,我的程序崩溃了。(在新窗口中时)程序在调用gCanvas.Height或gCanvas.Width时崩溃,但如果我将其更改为gCanvas.ActualHeight和gCanvas.ActualWidth,程序将运行,但它不会绘制x轴和y轴。有人知道为什么画布在我的主窗口中而不是在我的新窗口中时该方法有效吗,下面是代码: private void draw()

所以我只是想在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>
那么,你的问题是

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

不,你是唯一知道的人。但是,从您的问题描述中,我可以看出,在调用
draw
方法时,
gCanvas
控件尚未呈现。我之所以能这么说,是因为您的
异常
是在
gCanvas.Width
调用时抛出的,因此该异常的值必须是
Nan
,或者不是数字

ActualWidth
属性将不会返回该值,这就是为什么它会起作用。由于没有绘制形状,因此我可以假设
ActualWidth
属性返回
0
。因此,如果是这种情况,那么这就说明了一个事实,即您必须过早地调用
draw
方法,如果您在构造函数中这样做,那么就太早了。相反,请在
窗口上处理:

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

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

如何将其添加到新窗口?代码愉快强烈建议您用XAML定义UI,而不是用C#代码按程序创建UI。你不会发现这些问题。你能在第一个窗口显示XAML吗?
public YourWindow()
{
    ...
    Loaded += YourWindow_Loaded;
}

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