2009-02-11 2 views
1

Мне нужно вставить UIElements в сетку, которая не генерируется до времени исполнения. В частности, мне нужно добавить UIElements в создаваемые RowDefinitions после определения количества элементов, которые нужно отобразить. Есть ли способ обойти Grid.Row и Grid.Column и Grid.RowSpan, как в XAML для объектов на C#? Если я собираюсь сделать это неправильно, пожалуйста, дайте мне знать. Я не могу использовать StackPanel (я создаю динамическую панель гармоник, и это связано с анимацией).Динамическая сетка в Silverlight 2 с использованием C#

В настоящее время происходит то, что я генерирую количество RowDefinitions во время выполнения и добавляю UIElements в качестве дочерних элементов. Это не работает, все UIElements попадают в первую строку, расположенную поверх друг друга.

Вот пример того, что я пытаюсь:

public partial class Page : UserControl 
{ 
    string[] _names = new string[] { "one", "two", "three" }; 
    public Page() 
    { 
     InitializeComponent(); 
     BuildGrid(); 
    } 
    public void BuildGrid() 
    { 
     LayoutRoot.ShowGridLines = true; 
     foreach (string s in _names) 
     { 
      LayoutRoot.RowDefinitions.Add(new RowDefinition()); 
      LayoutRoot.Children.Add(new Button()); 
     } 
    } 
} 

Спасибо!

ответ

3

Помимо Grid, который не является подходящим инструментом для работы (ListView будет), вам нужно указать Button, к которой он принадлежит.

public void BuildGrid() 
{ 
    LayoutRoot.ShowGridLines = true; 
    int rowIndex = 0; 
    foreach (string s in _names) 
    { 
     LayoutRoot.RowDefinitions.Add(new RowDefinition()); 
     var btn = new Button() 
     LayoutRoot.Children.Add(btn); 
     Grid.SetRow(btn, rowIndex); 
     rowIndex += 1; 
    } 
} 
0

Я никогда не использовал этот материал, но разве вы не должны добавлять кнопку в RowDefinitions вместо детей? (просто логическое наблюдение)

+0

Вот что я первоначально пытался, но не реальный способ сделать это, что я знаю. RowDefinitions - довольно простые классы из того, что я могу сказать. – Steve

2

Лучший способ сделать то, что вы ищете, чтобы следовать ниже схеме:

Page.xaml:

<UserControl x:Class="SilverlightApplication1.Page" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" 
    Width="400" Height="300"> 
    <Grid x:Name="LayoutRoot" Background="White"> 
     <data:DataGrid x:Name="DataGridTest" /> 
    </Grid> 
</UserControl> 

Page.xaml.cs:

public partial class Page : UserControl 
    { 
     string[] _names = new string[] { "one", "two", "three" }; 

     public Page() 
     { 
      InitializeComponent(); 
      BuildGrid(); 
     } 

     public void BuildGrid() 
     { 
      DataGridTest.ItemsSource = _names; 
     } 
    } 

Это строит строки динамически из содержимого вашего массива строк. В будущем еще лучше будет использовать ObservableCollection, где T реализует INotifyPropertyChanged. Это приведет к уведомлению DataGrid об обновлении его строк, если вы удалите или добавите элемент из коллекции, а также при изменении свойств T.

Для дальнейшей настройки UiElements, используемые для отображения вещей, которые вы можете использовать DataGridTemplateColumn:

<data:DataGridTemplateColumn Header="Symbol"> 
    <data:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding PutNameOfPropertyHere}" /> 
     </DataTemplate> 
    </data:DataGridTemplateColumn.CellTemplate> 
</data:DataGridTemplateColumn> 
+0

Скорее всего, я должен это делать, но это больше, чем мне нужно сейчас, благодарю вас за невероятно описательный и хорошо написанный ответ. Я бы проголосовал за вас, но у меня недостаточно очков. – Steve

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