Помощь с интерфейсом WPF - PullRequest
       3

Помощь с интерфейсом WPF

0 голосов
/ 08 февраля 2011

Мне нужно создать динамический интерфейс в WPF.Примерно так:

  Date   Hyatt Regency  Ritz Carlton    Holiday Inn..
             16             10               5
 12/16      20%             12%             10%

            10              5                4
 12/17      2%              3%               1%

Теперь мой вопрос заключается в том, что, поскольку весь пользовательский интерфейс является динамическим, гостиница называет числовую сумму, я не могу их правильно расставить.Поэтому, если название отеля станет длинным, приведенные ниже записи не будут правильно выровнены.Есть ли способ в WPF, что я могу динамически создавать XAML из кода и при этом выглядеть идеально с интервалом.

Ответы [ 3 ]

1 голос
/ 09 февраля 2011

Я думаю, что вы после чего-то вроде этого:

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

        List<List<String>> data = GetData();
        var grid = CreateGrid(data.Count, data.First().Count());
        PopulateGrid( grid, data );
        this.Content = grid;            
    }

    private void PopulateGrid(Grid grid, List<List<string>> data)
    {
        int rowNumber = 0;
        foreach (var rowContents in data)
        {
            int colNumber = 0;
            foreach (var colValue in rowContents)
            {
                var tb = new TextBlock { Text = colValue, HorizontalAlignment = HorizontalAlignment.Center, Margin=new Thickness(5) };
                Grid.SetRow(tb, rowNumber);
                Grid.SetColumn(tb, colNumber);
                grid.Children.Add(tb);
                colNumber++;
            }
            rowNumber++;
        }
    }

    private List<List<string>> GetData()
    {
        return new List<List<String>>() 
        {
            new List<String>( ) { "Date",  "Hyatt Regency",  "Ritz Carlton", "Holiday Inn" },
            new List<String>( ) { "",  "16",  "10", "5" },
            new List<String>( ) { "12/16",  "20%",  "12%", "10%" },
            new List<String>( ) { "",  "",  "", "" },
            new List<String>( ) { "",  "10",  "5", "4" },
            new List<String>( ) { "12/17",  "2%",  "3%", "1%" },
        };
    }

    private Grid CreateGrid(int rows, int cols)
    {
        var grid = new Grid();

        for (int r = 0; r < rows; r++)
            grid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
        for (int c = 0; c < rows; c++)
            grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });

        return grid;
    }
}
1 голос
/ 08 февраля 2011

Вы пробовали DataGrid ?

Если встроенный не делает это за вас, существует множество сторонних элементов управления сеткой данных:

Telerik GridView

DevExpress DXGrid

и многое другое. Если вы посмотрите вокруг, вы также можете найти бесплатные.

0 голосов
/ 09 февраля 2011

Вы можете просто использовать обычный старый Grid:


Дата Хаятт Ридженси Ритц-Карлтон Holiday Inn

    <TextBlock Grid.Row="1" Grid.Column="1" HorizontalAlignment="Right">16</TextBlock>
    <TextBlock Grid.Row="1" Grid.Column="2" HorizontalAlignment="Right">10</TextBlock>
    <TextBlock Grid.Row="1" Grid.Column="3" HorizontalAlignment="Right">5</TextBlock>

    <TextBlock Grid.Row="2" Grid.Column="0" HorizontalAlignment="Center">12/16</TextBlock>
    <TextBlock Grid.Row="2" Grid.Column="1" HorizontalAlignment="Right">20%</TextBlock>
    <TextBlock Grid.Row="2" Grid.Column="2" HorizontalAlignment="Right">12%</TextBlock>
    <TextBlock Grid.Row="2" Grid.Column="3" HorizontalAlignment="Right">10%</TextBlock>

    <TextBlock Grid.Row="3" Grid.Column="1" HorizontalAlignment="Right">10</TextBlock>
    <TextBlock Grid.Row="3" Grid.Column="2" HorizontalAlignment="Right">5</TextBlock>
    <TextBlock Grid.Row="3" Grid.Column="3" HorizontalAlignment="Right">4</TextBlock>

    <TextBlock Grid.Row="4" Grid.Column="0" HorizontalAlignment="Center">12/17</TextBlock>
    <TextBlock Grid.Row="4" Grid.Column="1" HorizontalAlignment="Right">2%</TextBlock>
    <TextBlock Grid.Row="4" Grid.Column="2" HorizontalAlignment="Right">3%</TextBlock>
    <TextBlock Grid.Row="4" Grid.Column="3" HorizontalAlignment="Right">1%</TextBlock>
  </Grid>
  <TextBlock/>
</DockPanel>

Но если вы 'перестраивая что-то вроде этого, используя code-behind, вы делаете это неправильно.Вы должны использовать шаблоны данных и привязку.Чтобы сделать это, вам нужно создать отдельную сетку для каждого блока данных и использовать группы общих размеров, чтобы синхронизировать ширину столбцов.Это несколько больший вопрос, но тот, на который вы можете ответить после того, как правильно разработали макет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...