2011-02-08 2 views
0

У меня есть GroupBox name groupBox1 и содержит StackPanel. В StackPanel у меня есть serevral ChechBoxes. В моем xaml.cs я хочу, чтобы получить эти CheckBoxes, но когда я пишу следующую строку кода я получаю ноль:Содержимое GroupBOx WPF

int n = VisualTreeHelper.GetChildrenCount(groupBox1); 

Если я пишу следующую строку кода я получаю Exeption:

«указано index находится за пределами допустимого диапазона или дочерний элемент с индексом имеет значение null. Не вызывайте этот метод, если VisualChildrenCount возвращает ноль, что указывает на то, что У Visual нет дочерних элементов. Параметр имя: индекс Фактическое значение равно 0. "

Visual v = (Visual)VisualTreeHelper.GetChild(groupBox1, 0); 

Это означает, что мой groupBox1 не имеет детей .... но как насчет StackPanel?

У меня есть эта функция, которая должна itarete над VisualTree, это выглядит следующим образом:

private void VisualChildren (Visual myVisual) 
{   
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(myVisual); i++) 
    { 
     Visual childVisual = (Visual)VisualTreeHelper.GetChild(myVisual, i); 

     //Some operations 

     VisualChildren(childVisual); 
    } 
} 

Он не принимает StackPanel в groupBox1 ......

Может кто-нибудь пожалуйста, скажите мне как я могу добраться до тех CheckBoxes?
Спасибо.


Это моя XAML:

<Window x:Class="MyNamespace.MyClass" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Test" Height="300" Width="300" Loaded="Window_Loaded" Name="win1"> 
    <Grid Name="grid1"> 
     <GroupBox Header="GroupBox" Margin="0,0,95,124" Name="groupBox1"> 
      <StackPanel Orientation="Vertical" Height="105"> 
       <CheckBox Height="Auto" Name="checkBox4" Width="Auto" Margin="2">CheckBox</CheckBox> 
       <CheckBox Height="Auto" Name="checkBox2" Width="Auto" Margin="2">CheckBox</CheckBox> 
       <CheckBox Height="Auto" Name="checkBox3" Width="Auto" Margin="2">CheckBox</CheckBox> 
       <CheckBox Height="Auto" Name="checkBox5" Width="Auto" Margin="2">CheckBox</CheckBox> 
       <CheckBox Height="Auto" Name="checkBox1" Width="Auto" Margin="2">CheckBox</CheckBox> 
       <CheckBox Height="Auto" Name="checkBox6" Width="Auto" Margin="2">CheckBox</CheckBox> 
       <CheckBox Height="Auto" Name="checkBox7" Width="Auto" Margin="2">CheckBox</CheckBox> 
      </StackPanel> 
     </GroupBox> 
     <WrapPanel Orientation="Horizontal" Name="wrap2" Margin="8" HorizontalAlignment="Center" VerticalAlignment="Bottom"> 
      <Button Margin="5" Height="23" Name="button1" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="75">Button</Button> 
      <Button Margin="5" Height="23" HorizontalAlignment="Right" Name="button2" VerticalAlignment="Bottom" Width="75">Button</Button> 
      <Button Margin="5" Height="23" HorizontalAlignment="Right" Name="button3" VerticalAlignment="Top" Width="75">Button</Button> 
      <Button Margin="5" Height="23" HorizontalAlignment="Right" Name="button4" VerticalAlignment="Top" Width="75">Button</Button> 
      <Button Margin="5" Height="23" HorizontalAlignment="Right" Name="button5" VerticalAlignment="Top" Width="75">Button</Button> 
      <Button Margin="5" Height="23" HorizontalAlignment="Right" Name="button6" VerticalAlignment="Top" Width="75">Button</Button> 
     </WrapPanel> 
    </Grid> 
</Window> 

и это код:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
     try 
     { 
      VisualChildren(grid1); 
     } 
    } 

    private void VisualChildren(Visual myVisual) 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(myVisual); i++) 
     { 
      Visual childVisual = (Visual)VisualTreeHelper.GetChild(myVisual, i); 
      System.Windows.Forms.MessageBox.Show(childVisual.ToString()); 
      VisualChildren(childVisual); 
     } 
    } 
} 

ответ

3

Видимо, проблема в том, что вы пытаетесь получить наглядные детей элемента, прежде чем он получает загружен. В то время визуальное дерево еще не составлено. Попробуйте подписаться на Loaded случае вашей группы коробки и получить наглядные ребенок в обработчик события:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 

     Loaded += OnLoaded; 
    } 

    private void OnLoaded(object sender, EventArgs e) 
    { 
     VisualChildren(grid1); 
    } 

    ... 
} 
+0

Хорошо, спасибо, я буду стараться, но как сетки и другие StackPanels, что я имею в моем окне являются работая в этом методе, и я могу использовать их детей? – olia

+0

Если вы разместили свой XAML и где вы пытаетесь получить визуальных детей в обоих случаях, это может помочь диагностировать проблему. –

Смежные вопросы