2017-07-31 89 views
-1

我有wpf解决方案,其中我创建了UserControl进行趋势分析。这个UserControl在MainWindow中使用。使用SizeChanged事件时在主窗口中出现异常

趋势的路径绘制在当前的class ChartControl的showData()方法上。但是因为我想要获得与主窗口大小相关的路径的实际图片,所以我在该showData()方法被调用的地方添加了0​​事件。

我对事件这里代码:

private void OnResize(object sender, SizeChangedEventArgs e) 
     { 
      this.showData(); 
     } 

编辑:

private List<ChartData> data = new List<ChartData>(); 
    public void showData() 
      { 
       double maxVal = this.maxVal(); 
       double minVal = this.minVal(); 
       TimeSpan timeSpan = new TimeSpan(); 
       timeSpan = this.maxTime() - this.minTime(); 
       double stepSize = Area.ActualWidth/timeSpan.TotalSeconds; 

       setLabels(); 

       Area.Children.Clear(); 

       for (int i = 1; i < this.data.Count; i++) 
       { 
        Line lineHorizont = new Line(); 
        lineHorizont.StrokeThickness = 2; 
        lineHorizont.Stroke = Brushes.Red; 

        lineHorizont.X1 = (this.data[i].X - this.minTime()).TotalSeconds * stepSize; 
        lineHorizont.Y1 = Math.Abs(((this.data[i - 1].Y - minVal)/(maxVal - minVal) * Area.ActualHeight) - Area.ActualHeight); 

        lineHorizont.X2 = lineHorizont.X1; 
        lineHorizont.Y2 = Math.Abs(((this.data[i].Y - minVal)/(maxVal - minVal) * Area.ActualHeight) - Area.ActualHeight); 

        Area.Children.Add(lineHorizont); 

        Line lineVertical = new Line(); 
        lineVertical.StrokeThickness = 2; 
        lineVertical.Stroke = Brushes.Red; 

        lineVertical.X1 = (this.data[i - 1].X - this.minTime()).TotalSeconds * stepSize; 
        lineVertical.Y1 = Math.Abs(((this.data[i - 1].Y - minVal)/(maxVal - minVal) * Area.ActualHeight) - Area.ActualHeight); 

        lineVertical.X2 = (this.data[i].X - this.minTime()).TotalSeconds * stepSize; 
        lineVertical.Y2 = lineVertical.Y1; 

        Area.Children.Add(lineVertical); 
       } 

       //Draw cross coordinator 
       coordX1.StrokeThickness = 1; 
       coordX1.Stroke = Brushes.Black; 
       coordX1.X1 = 0; 
       coordX1.Y1 = Mouse.GetPosition(Area).Y; 
       coordX1.X2 = Area.ActualWidth; 
       coordX1.Y2 = coordX1.Y1; 
       Area.Children.Add(coordX1); 

       coordX2.StrokeThickness = 1; 
       coordX2.Stroke = Brushes.Black; 
       coordX2.X1 = Mouse.GetPosition(Area).X; 
       coordX2.Y1 = 0; 
       coordX2.X2 = coordX2.X1; 
       coordX2.Y2 = Area.ActualHeight; 
       Area.Children.Add(coordX2); 
      } 

public double maxVal() 
     { 
      List<double> data = new List<double>(); 
      for (int i = 0; i < this.data.Count; i++) 
      { 
       data.Add(this.data[i].Y); 
      } 
      return data.Max<double>(); 
     } 

EDIT2:ChartControl的 xaml内容主的窗口

<Grid Margin="0"> 
     <lib:ChartControl x:Name="Trend" Margin="0" Width="Auto" Height="Auto"/> 

    </Grid> 

xaml内容

<Grid Grid.Column="1" Margin="0" Grid.Row="1" Background="Black" Cursor="Cross" PreviewMouseMove="OnMouseMove"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="1*"/> 
       <RowDefinition Height="1*"/> 
       <RowDefinition Height="1*"/> 
       <RowDefinition Height="1*"/> 
       <RowDefinition Height="1*"/> 
       <RowDefinition Height="1*"/> 
       <RowDefinition Height="1*"/> 
       <RowDefinition Height="1*"/> 
       <RowDefinition Height="1*"/> 
       <RowDefinition Height="1*"/> 
      </Grid.RowDefinitions> 
      <Rectangle Fill="#FFF1F1F1" Grid.RowSpan="10"/> 
      <Rectangle Fill="#FFD4D4D4"/> 
      <Rectangle Fill="#FFD4D4D4" Grid.Row="2"/> 
      <Rectangle Fill="#FFD4D4D4" Grid.Row="4"/> 
      <Rectangle Fill="#FFD4D4D4" Grid.Row="6"/> 
      <Rectangle Fill="#FFD4D4D4" Grid.Row="8"/> 
      <Canvas x:Name="Area" Grid.RowSpan="10"/> 
     </Grid> 

程序启动后,一切工作正常,并根据期望,但我在视觉工作室的视图设计师,这是消除任何设计更改异常。

exception

+0

Thx for downvote,但有些提示,为什么它的坏问题将是有益的。 –

+0

我猜stacktrace是相当丰富的。 'chart.lib.ChartCOntrol.maxVal()'使用'Linq.Max',但它没有元素 –

+0

很难说,看不到showData的代码。 – gdir

回答

0
List<double> data = new List<double>(); 
for (int i = 0; i < this.data.Count; i++) 
{ 
    data.Add(this.data[i].Y); 
} 
return data.Max<double>(); 

请,请,请不要命名局部变量与您的外部范围变量。

至于为什么这个失败,这是显而易见的:

this.data是空的时候这就是所谓的,因此,当您尝试执行data.Max<double>()你得到一个异常。

您在ShowData()的最开始处打电话给MaxVal(),据我所知,没有真正可辨别的地方,您将任何ChartData添加到数据列表。

+0

好吧,我会尽量避免这种命名失败,但仍然,我得到异常,不是在应用程序启动后,只在视图设计师,应用程序工作正常。这个数据在应用程序启动后立即添加。我试图删除调用maxVal()方法,但没有区别。 –

+0

堆栈跟踪显示它正在执行Resize-> showData-> maxVal;所以当设计师进入时,maxVal失败,因为数据收集是空的。 – Clint

+0

感谢我得到它,它帮助,但我有类似的方法来计算与列表的东西,所以我必须以不同的方式编码。 –

1

OnResize事件处理程序中,您必须测试当前实例未处于设计模式。

System.ComponentModel.DesignerProperties.GetIsInDesignMode(this) 

如果你没有数据然后返回...那么没有更多的设计异常!

private void OnResize(object sender, SizeChangedEventArgs e) { 
    if(!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this)) 
     this.showData(); 
} 
+0

这个方法应该使用什么名字空间?我在使用这个时遇到错误。 –

+0

System.ComponentModel.DesignerProperties.GetIsInDesignMode(this) – GCamel

+0

谢谢,这也是一个很好的解决方案,但它只是我的坏方法的修复,更正确的可能是弄清楚如何在没有数据的情况下不调用方法。 –