我想在WPF窗口上创建任意数量的标签和文本框。这样的事情在WinForms中很容易做到,我以为我在WPF中有这样做,但是我得到了奇怪的结果。
即我想要在视觉上发生的是下面(模拟)。新控件的数量和内容是任意的,可能是从文本文件中获取的。还有一个问题是,如果有大量的控件,可以使表单可滚动,但首先要做的事情。
所以我将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");
我得到的是这样的:
我做的事情显然是错的,但我不知道是什么。此外,我将不再就GUI框架的相对优点发表意见。我只想说我是these之一。
答案 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>
执行以下操作:
ObservableCollection<Input>
使每个项目成为水平堆栈面板
一个。具有绑定到项目“Label”属性的文本块
湾有一个文本框绑定到项
将其与等效的WinForms代码进行比较。我认为它很多更清晰,更易于维护和理解,总体而言,这是更好的做法。我强烈反对在这种情况下使用WinForms“更容易”生活。