2012-12-28 42 views
0

好吧,听起来好像我没有做任何研究,但我做了。我有这样的形式:窗体锚/码头

enter image description here

,我想通过动态地添加这是OK的标签和文本框使用它的玩家我想任何金额。不过我发现中间的空间非常乏味。如何根据我拥有的组件数来设置组件的排序方式。我记得使用Java,有一种方法来打包组件,但在C#中似乎没有这种东西。我研究了锚和码头,但我希望也许有一个更简单的方法?

如果不是,你如何建议我这样做?

+0

什么样的形式? WPF? –

+0

是的我正在使用WPF – Bernice

+0

这真的是一个非常大的差异。如果您使用的是WPF,那么使用[tag:wpf]标签。 –

回答

0

我会创建一个类来保存“PlayerNo”(Int32)和“PlayerName”(String)等属性。 我们称之为“PlayerInfo”类。

其次我会创建一个PlayerInfo的ObservableCollection并添加玩家的数量。 我们称之为玩家。我会为所有属性创建依赖属性,以便我可以在XAML中使用我的类,并使用INgify INotifyPropertyChanged来自动更新UI。

this.Players = new ObservableCollection<PlayerInfo>(); 
this.Players.Add(new PlayerInfo() { PlayerNo=0, PlayerName=null }); 
this.Players.Add(new PlayerInfo() { PlayerNo=1, PlayerName=null }); 
this.Players.Add(new PlayerInfo() { PlayerNo=2, PlayerName=null }); 

然后,我会在XAML中创建一个ItemsPresenter控件,该控件具有从ItemsSource到模型类的Players属性的绑定。您甚至可以填写“PlayerName”多基于上一轮等等等等,我已经说明了它的玩家通过设定为“空”(这当然是没有必要的,只是举例)

<ItemsControl ItemsSource="{Binding Path=Players, Mode=OneWay}"> 
    <ItemsControl.ItemsPanel> 
    <StackPanel Orientation="Vertical" /> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <StackPanel Orientation="Horizontal" Margin="0,20,0,0"> 
     <TextBlock Text="Player" /> 
     <TextBlock Text="{Binding Path=PlayerNo, Mode=OneWay}" Margin="10,0,20,0" /> 
     <TextBox Text="{Binding Path=PlayerName, Mode=TwoWay}" Width="200" /> 
     </StackPanel> 
    </DataTemplate> 
    <ItemsControl.ItemTemplate> 
</ItemsControl> 

对于ItemsPresenter类,我会创建一个ItemTemplate,它包含一个显示“Player”后跟“PlayerId”编号的TextBlock。我将使用一个TextBox,该TextBox具有从Text属性到项目的“PlayerName”属性的绑定。

这样,我会有小代码隐藏和小XAML。这是一个简单的解决方案。 而且我也会让玩家的所有细节都准备好使用。

0

您可以尝试使用UniformGrid(可能默认不包含在Visual Studio工具箱中,但可以手动添加它)。例如,您的XAML代码可能是这样的:

<UniformGrid HorizontalAlignment="Center" Name="uniformGrid1" VerticalAlignment="Stretch" Width="200" Columns="1" /> 

和代码添加控件到UniformGrid是:

TextBox tb = new TextBox(); 
tb.Width = 100; 
tb.Height = 26; 
Label lbl = new Label(); 
lbl.Content = "Player:"; 
Canvas canvas = new Canvas(); 
Canvas.SetLeft(lbl, 10); 
Canvas.SetTop(lbl, 5); 
Canvas.SetLeft(tb, 60); 
Canvas.SetTop(tb, 5); 
canvas.Children.Add(lbl); 
canvas.Children.Add(tb); 
uniformGrid1.Children.Add(canvas); 

顺便说一句,我认为你的字体颜色应是白色的(或其他具有更好对比度的)。