形式锚/码头

时间:2012-12-28 23:49:30

标签: c# wpf anchor

好吧这听起来好像我没有做任何研究,但我做到了。我有这样的表格:

enter image description here

我希望通过动态添加标签和文本框来将它用于我想要的任何数量的玩家。但是我发现中间的空间非常繁琐。如何根据我拥有的组件数量将组件设置为打包类型。我记得使用Java,有一种方法来打包组件,但在C#中似乎没有这样的东西。我研究过锚和码头,但我希望有一种更简单的方法吗?

如果没有,你怎么建议我这样做?

2 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分:0)

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

其次我会创建一个PlayerInfo的ObservableCollection并添加那里的玩家数量。 我们称之为玩家。我会为所有属性创建Dependency Property,这样我就可以在XAML中使用我的类,并且使用INgifyPropertyChanged,以便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”等等。我已经通过将其设置为“null”来说明(当然这不是必需的,只是说明性的)

<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,它具有从Text属性到项目的“PlayerName”属性的绑定。

这样,我会有很少的代码隐藏和很少的XAML。这是一个简单的解决方案。 而且我也可以随时使用播放器细节。