Любой WPF UIElement
имеет свойство Children
, которое предоставит вам все его дочерние элементы управления. Таким образом, вы можете использовать его для перечисления детей, а затем l oop через них. Что-то вроде;
foreach (var child in MasterGrid.Children)
{
// string builder code
}
Вы не совсем ясно объяснили, каковы ваши критерии для отображения элемента управления, но из ограниченного объяснения, которое вы дали, похоже, что вы хотите получить свойство Text
, если это TextBox
, SelectedItem
, если это ComboBox
, и имя элемента управления, если это RadioButton
. Когда дело доходит до элемента управления, это совершенно разные вещи, поэтому внутри l oop вам нужно будет проверить тип каждого дочернего элемента управления и получить правильную информацию.
private void CopyButton_Click(object sender, RoutedEventArgs e)
{
StringBuilder value = new StringBuilder();
foreach (var child in MasterGrid.Children.OfType<Control>())
{
if (child.GetType() == typeof(TextBox))
{
value.Append(((TextBox)child).Text + Environment.NewLine);
}
else if (child.GetType() == typeof(RadioButton))
{
var rb = (RadioButton)child;
if (rb.IsChecked == true)
{
value.Append(rb.Name + Environment.NewLine);
}
}
else if (child.GetType() == typeof(ComboBox))
{
value.Append(((ComboBox)child).Text + Environment.NewLine);
}
}
MessageBox.Show(value.ToString());
}
Выше приведены типы элементов управления, о которых вы упомянули, вам придется выяснить, что делать с другими типами элементов управления.
Далее, когда дело доходит до порядка, в элементах управления в WPF могут быть разные значения «порядка». GUI.
- Хотите ли вы порядок, в котором они указаны в коде
XAML
? - Или вы хотите порядок, в котором они отображаются, когда программа запускается?
Например, в вашем коде, если вы переместили последнее текстовое поле XAML
код над предпоследним, они все равно будут отображаться в исходном порядке при запуске программы потому что вы жестко запрограммировали их расположение (что само по себе плохая идея; вы должны использовать сетки, панели стека и т. д. c, чтобы сделать макет в WPF
).
Я думаю, если вам не все равно о порядке, лучший вариант - изменить y свой XAML
и укажите свойство Tag
каждого элемента управления.
Например,
<TextBox Grid.Column="1"
Width="408"
Height="23"
Margin="0,21,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Top"
Tag="1"
TextWrapping="Wrap"/>
Затем, когда вы перечисляете дочерние элементы, выполняйте порядок по тегам перед их итерацией.
Таким образом, у вас будет твердый контроль над тем, что вы подразумеваете под заказом.
var children = MasterGrid.Children.OfType<Control>().OrderBy(x => x.Tag);
foreach (var child in children)
{
// Same as before
}