Динамическая сетка в Silverlight 2 с использованием C # - PullRequest
1 голос
/ 12 февраля 2009

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

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

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

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 ]

3 голосов
/ 12 февраля 2009

Помимо того, что 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;
    }
}
2 голосов
/ 12 февраля 2009

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

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.

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

<data:DataGridTemplateColumn Header="Symbol">
    <data:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding PutNameOfPropertyHere}" />
        </DataTemplate>
    </data:DataGridTemplateColumn.CellTemplate>
</data:DataGridTemplateColumn>
0 голосов
/ 12 февраля 2009

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

...