6

多くのラベルを持つ WPF アプリケーションがあります。

<Label x:Name="label1" />
<Label x:Name="label2" />
<Label x:Name="label3" />
....

次のように、すべてのラベルに1つずつ値を付けたくありません。

label1.content= 1;
label2.content= 20;
label3.content= 30;
....

私はもっ​​とこのようにしたい:

for(int i = 1; i<40 ;i++)
{
    label"i".content = i*10;
}

それを行う方法はありますか?

4

6 に答える 6

6

ラベルの名前がす​​べて一貫している場合は、次のようにすることができます。

var numberOfLabels = 40;

for(int i = 1; i <= numberOfLabels; i++)
{
    var labelName = string.Format("label{0}", i);
    var label = (Label) this.FindName(labelName);
    label.Content = i * 10;
}
于 2013-06-04T14:16:28.473 に答える
3

バインディングを使用する場合は簡単です。ラベルの内容をObservableCollection<string>ViewModel に保持するだけです。そして、あなたのケースの反復では、それらを使って好きなことをすることができます。

編集1:

また、xaml は次のようになります。

        <ItemsControl ItemsSource="{Binding MyLabelValues}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <sdk:Label Content="{Binding Mode=TwoWay}"></sdk:Label>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
于 2013-06-04T14:13:01.810 に答える
2

このコードの使用

public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
    if (depObj != null)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
            if (child != null && child is T)
            {
                yield return (T)child;
            }

            foreach (T childOfChild in FindVisualChildren<T>(child))
            {
                yield return childOfChild;
            }
        }
    }
}

すべてのコントロールをタイプ別に列挙できます。

foreach (Label lbl in FindVisualChildren<Label>(window))
{
    // do something with lbl here
}
于 2013-06-04T14:13:44.807 に答える
1

これらすべてLabelList<Label>フォームのコンストラクター内に追加できます。

面倒な作業ですが、1 回だけで済みます。

List<Label> labels = new List<Label>();
labels.Add(label1);
// etc.

// loop
for (int i = 0; i < labels.Count; i++)
    labels[i].Text = i.ToString();

// alternative loop
foreach (Label label in labels)
    label.Text = "test";
于 2013-06-04T14:13:00.073 に答える
1

これはどう?

List<Label> labelL = new List<Label>();

for(int i = 1; i<40 ;i++)
    labelL.Add(new Label{ Name = "label"+i, Content = i*10 });

最終結果はこれになります。

label1.Text = 10;
label2.Text = 20;
label3.Text = 20;
...
...
于 2013-06-04T14:14:48.787 に答える