2014-02-27 46 views
0

所以我只是试图在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(); 

    } 
+0

你是如何将其添加到新的窗口?请代码 – AlSki

+1

强烈建议您在XAML中定义UI,而不是在C#代码中以程序化方式创建它。你不会找到任何这些问题的方式。 –

+0

你能否为第一个窗口显示XAML? –

回答

0

抽奖功能,因此,你的问题是

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

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

ActualWidth属性不会返回该值,所以这就是为什么工作。由于未绘制形状,因此我可以假设ActualWidth财产返回0。所以如果是这种情况,那么这就意味着你必须必须过早地调用draw方法,如果你在构造函数中这样做,那么太早了。相反,关于办理WindowFrameworkElement.Loaded Event

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

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