在WPF表单上创建可变数量的TextBox

时间:2014-10-06 20:51:12

标签: c# wpf xaml visual-studio-2012 user-interface

我想在WPF窗口上创建任意数量的标签和文本框。这样的事情在WinForms中很容易做到,我以为我在WPF中有这样做,但是我得到了奇怪的结果。

即我想要在视觉上发生的是下面(模拟)。新控件的数量和内容是任意的,可能是从文本文件中获取的。还有一个问题是,如果有大量的控件,可以使表单可滚动,但首先要做的事情。

Before creating controls

After creating controls

所以我将VS创建的默认网格命名为“grdWiz”,并在我的窗口中创建了以下实用程序功能。原油,我知道,但首先我想确保事情有效并且事后才能美化。 UPDATE:我现在使用Canvas对象而不是Grid,并使用Canvas类型而不是InkCanvas类型来尝试设置位置。见下文:

    private int nInputs = 0;

    private void AddInput(string defLabel, string defValue)
    {
        Label newLabel = new Label() { Name = "lblConf" + nInputs };
        TextBox newText = new TextBox() { Name = "tbConf" + nInputs };
        grdWiz.Children.Add(newLabel);
        Canvas.SetLeft(newLabel, 0);
        Canvas.SetTop(newLabel, nInputs * 30);
        newLabel.Width = grdWiz.Width / 3;
        grdWiz.Children.Add(newText);
        Canvas.SetLeft(newText, grdWiz.Width / 3);
        Canvas.SetTop(newText, nInputs * 30);
        newText.Width = grdWiz.Width * 0.6666;
        newText.Height = 30;
        newText.Text = defValue;
        nInputs++;
    }

在按钮点击代码中,我执行以下操作:

    thatInitialLabel.Visibility = Visibility.Hidden;
    AddInput("Main Course:", "Grits");
    AddInput("Dessert:", "Apple Pie");
    AddInput("Fun activity to be had afterwards:", "Sleep");

我得到的是这样的:

Slightly-less-epic FAIL

我做的事情显然是错的,但我不知道是什么。此外,我将不再就GUI框架的相对优点发表意见。我只想说我是these之一。

1 个答案:

答案 0 :(得分:5)

嗯,你得到了问题的根源: WPF不是WinForms

在没有看到父XAML的情况下,我无法确定您当前的问题是什么。如果没有正确的父控件,您使用的附加属性可能没有任何效果。话虽如此,有一种更容易的方式。

首先,创建一个为数据建模的类;说:

public class Input
{
    public string Label {get; set;}
    public string Value {get; set;}
}

没有经历如何设置MVVM:MVVM: Tutorial from start to finish?

这样做:

<ListView ItemsSource="{Binding InputCollection}">
   <ListView.ItemTemplate>
      <DataTemplate>
         <StackPanel Orientation="Horizontal">
             <TextBlock Text="{Binding Label}"/>
             <TextBox Text="{Binding Value}"/>
         </StackPanel>
      </DataTemplate>
   </ListView.ItemTemplate>
</ListView>

执行以下操作:

  1. 设置一个ListView,它填充ViewModel中的“InputCollection”属性,可能是ObservableCollection<Input>
  2. 使每个项目成为水平堆栈面板

    一个。具有绑定到项目“Label”属性的文本块

    湾有一个文本框绑定到项

  3. 的“值”属性

    将其与等效的WinForms代码进行比较。我认为它很多更清晰,更易于维护和理解,总体而言,这是更好的做法。我强烈反对在这种情况下使用WinForms“更容易”生活。