2011-05-20 73 views
6

当将 儿童添加到堆叠面板时,我得到的“价值不在预期范围例外范围内”。即使在添加到堆栈面板之前,myStackPanel.Children.Count = 0时也会发生这种情况。任何想法为什么?Silverlight:值不在预期范围内例外

void func() 
{ 
      myStackPanel.Children.Clear();   
      List<Docs> lDocs = docDictionary[ID]; 
      foreach (Docs lDoc in lDocs) 
      { 
       ... 
       Border myTextborder = new Border();     
       myTextborder.BorderThickness = new Thickness(1); 
       myTextborder.Name = lDoc.Name; 
       ... 

       myStackPanel.Children.Add(myTextborder); //Getting Value does not fall within the expected range exception here 
      } 
} 

func()被多次调用。我读到当我们尝试添加同名的孩子时发生错误。但在我的情况下,我正在清除堆栈面板,即使每次调用func时foreach循环只运行一次,也会发生错误()

+0

如果将'myTextborder.Name'行注释掉会怎么样? – Gabe 2011-05-20 03:25:50

+0

此外,您在示例中替换为“...”的代码可能是相关的。 – Josh 2011-05-20 03:28:22

+0

如果我评论它,错误不会发生。但是,对于每个func调用,我正在清除stackpanel。为什么发生这种情况。可能会从前面的func()调用中复制myTextBorder.Name,而不是当前的。当我每次清理时,这都很重要。 – Tsu 2011-05-20 03:29:04

回答

9

当有两个元素添加了相同名称时可能导致此错误。在你的情况,有没有重复的lDoc.Name值?如果是这样,您可以添加一个额外的唯一标识符。例如:

int id = 0; //outside foreach loop 

myTextborder.Name = lDoc.Name + id.ToString(); 
id++; 
0

仔细检查堆栈跟踪。有时行号是关闭的,但可能是在Name属性的setter中发生异常。它必须遵循标识符的正常规则。

0

在我看来,你真正想要的是一个ItemsControl,你是不是真的使用Silverlight的功能: -

<ScrollViewer> 
    <ItemsControl x:Name="items"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Border BorderThickness="1"> 
        <TextBlock Text="{Binding Name}" /> 
        <!-- what ever xaml you require to represent a document --> 
       </Border> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</ScrollViewer> 

那么你func变为: -

public void func() 
{ 
    items.ItemsSource = docDictionary[ID]; 
} 
0

我发现当您将控件的Name属性设置为Children中现有控件的相同名称时,通常会发生此错误。我的猜测是文档集合中有重复的名称。它并不总是错误,但它有时没有解释。

相关问题