#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. Или, если вы хотите придерживаться использования массива, опубликуйте код, в котором определен и добавлен массив, и я посмотрю