在网格中多次使用相同的 Canvas

Using the same Canvas multiple times in a Grid

我正在设计一个包含多列相同 Canvas 的网格。我将 Canvas 设计为具有文本框、组合框和一些单选按钮。

我对一些事情有点困惑)

添加新列

正在将 canvas 添加到此新列

调整间距使网格最多容纳 5 列(Canvases),然后显示水平滚动条。

这是我目前得到的:

    <Grid Height="379" Margin="35,0,35,65" VerticalAlignment="Bottom">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="200"/>
            <ColumnDefinition Width="200"/>
        </Grid.ColumnDefinitions>
        <Canvas Name="userCanvas" Grid.Column="0" Margin="0,0,707,0" RenderTransformOrigin="0.606,0.499" >
            <TextBox Height="23" Name="btn_Test" Canvas.Top ="10" Canvas.Left="10" Width="125" HorizontalAlignment="Center">Enter Input:</TextBox>
            <ComboBox Canvas.Top="50" Canvas.Left="10" Width="125">Combo Box</ComboBox>
            <RadioButton Canvas.Top="100" Canvas.Left="10">Radio Button1</RadioButton>
            <RadioButton Canvas.Top="120" Canvas.Left="10">Radio Button2</RadioButton>
            <RadioButton Canvas.Top="140" Canvas.Left="10">Radio Button3</RadioButton>
            <RadioButton Canvas.Top="160" Canvas.Left="10">Radio Button4</RadioButton>
        </Canvas>
    </Grid>

假设您尝试在运行时动态添加列,您可能需要 ItemsControl 而不是 GridItemsControl 可让您布置共享同一模板的重复元素。

我会从这样的事情开始:

<ItemsControl Margin="10"
              ItemsSource="{Binding Columns}">
  <ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
      <StackPanel Orientation="Horizontal" />
    </ItemsPanelTemplate>
  </ItemsControl.ItemsPanel>
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <Canvas>
        <TextBox Height="23" Name="btn_Test" Canvas.Top="10" Canvas.Left="10" Width="125" HorizontalAlignment="Center">Enter Input:</TextBox>
        <ComboBox Canvas.Top="50" Canvas.Left="10" Width="125">Combo Box</ComboBox>
        <RadioButton Canvas.Top="100" Canvas.Left="10">Radio Button1</RadioButton>
        <RadioButton Canvas.Top="120" Canvas.Left="10">Radio Button2</RadioButton>
        <RadioButton Canvas.Top="140" Canvas.Left="10">Radio Button3</RadioButton>
        <RadioButton Canvas.Top="160" Canvas.Left="10">Radio Button4</RadioButton>
      </Canvas>
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>

您的 DataContext 将需要包含一个 属性 Columns,它必须是某种 IEnumerable<Column>,其中每个 Column 包含数据和命令您需要 Canvas.

中的控件

更新

至于如何做到这一点,我首先建议您阅读 MVVM design pattern,这会使代码更易于维护、可测试和可重用。

不过,与此同时,要在屏幕上看到某些内容,您可以做的最简单的事情就是执行以下操作:

首先,把这个放在后面的代码中(例如,MainWindow.xaml.cs):

public IEnumerable<Column> Columns { get; set; }

public MainWindow()
{
    Columns = GetColumns();
    InitializeComponent();
}

private IEnumerable<Column> GetColumns()
{
    return Enumerable.Range(0, 5)
        .Select(x => new Column { Title = "Column " + x });
}

二、新建Column class:

public class Column
{
    public string Title { get; set; }
}

第三,将您的 TextBox 更改为以下内容:

<TextBox Height="23"
         Name="btn_Test"
         Canvas.Top="10"
         Canvas.Left="10"
         Width="125"
         HorizontalAlignment="Center"
         Text="{Binding Title}" />

我没有机会对此进行测试,但如果它按我的计划运行,您应该会看到五列水平排列,每列都有自己的标题("Column 1","Column 2"等)。