Windows Phone: добавление тегов XAML с помощью C #-команд

#c# #xaml #variables #windows-phone-8

#c# #xaml #переменные #windows-phone-8

Вопрос:

Приложение для Windows Phone 8 (C #):

  • У меня есть массив с именем пользователя, фамилией и номером сотрудника.
  • Этот массив не имеет фиксированной длины.
  • В XAML я пытаюсь показать список имен всех пользователей, ссылающихся на страницу, где нам понадобится их номер сотрудника.

Теперь, есть ли у кого-нибудь идея, можно ли добавить столько текстовых блоков XAML, сколько длина массива?

Они будут выглядеть следующим образом:

 <TextBlock x:Name="first" Text=""  HorizontalAlignment="Left" Margin="0,(*X* 50),0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="50" Width="445"/>
 

Девушка, которая начала разрабатывать это приложение, просто вставила 30 тегов текстовых блоков и использовала множество операторов if, чтобы заполнить их, если для них были доступны данные. Это единственно возможное решение? 🙁

Большое вам спасибо за вашу помощь! С уважением, Ребекка

Комментарии:

1. Эй, что это за операнд на вашем поле? Что (*X * 50)? Я никогда не видел, чтобы это делалось раньше, хотел бы узнать что-то новое сегодня 🙂

2. О, извините, я хотел сказать, что X — это переменная, поэтому наш запас всегда будет равен x = x 50

3. Это довольно круто, я даже не думал пробовать это раньше. Спасибо!

Ответ №1:

Код Xaml

    <ListBox x:Name="lstbx">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding FirstName}" Foreground="Red"></TextBlock>
            <TextBlock Text="{Binding LastName}" Foreground="Green"></TextBlock>
            <TextBlock Text="{Binding EmployeeNumber}" Foreground="Blue"></TextBlock>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
 

код на C #

 public class Person
{
    public string  FirstName { get; set; }
    public string  LastName { get; set; }
    public int EmployeeNumber { get; set; }

    public Person(string FirstName, string LastName, int EmployeeNumber)
    {
        this.FirstName = FirstName;
        this.LastName = LastName;
        this.EmployeeNumber = EmployeeNumber;
    }
}

       protected override void OnNavigatedTo(NavigationEventArgs e)
    {      
        var data = new Person[]
       {
           new Person("Fistname1","LastName1",1),
           new Person("Fistname2","LastName2",2),
           new Person("Fistname3","LastName3",3),
           new Person("Fistname4","LastName4",4),
       };
        lstbx.ItemsSource = data;
    }
 

Комментарии:

1. Это идеально! Большое вам спасибо !! 🙂

Ответ №2:

вы можете просто использовать цикл, подобный этому
foreach(string s in ArrayName)
{
TextBlock TB = new Textblock();
// set all the properties of the textblock like
TB.width= SOMEVALUE;
TB.height=SOMEVALUE;
.....
.....
.....
.....
// once you are done
// just put that Textblock as a child of the wrapper
//say you have a grid wrapping all your textboxes , then
GRID.children.add(TB);


}

Ответ №3:

Да, вы можете использовать цикл for в своем коде для создания нового текстового блока для каждого элемента в массиве. Возможно, вам лучше использовать a List<T> или observable collection, поскольку их легче перебирать, чем массив.

Код будет выглядеть примерно так:

  foreach (string item in myList)
        {
          var tb = new TextBlock();
              tb.Text = item
        }
 

Это псевдокод, но, надеюсь, вы поняли идею

Комментарии:

1. Или, если вы хотите придерживаться использования массива, опубликуйте код, в котором определен и добавлен массив, и я посмотрю