如何在 Silverlight 中动态设置复选框边距

How to set CheckBox margin dynamically in Silverlight

我正在 grid 上动态创建 CheckBoxes。现在我也想动态设置 margin(尊重 CheckBox)但不确定什么是最好的方法。

例如,

XAML:

<Grid x:Name="SynonymsGrid" Grid.Column="2" Margin="0,35,0,0" >
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
</Grid>

代码隐藏:

List<String> names = new List<string>() { "one", "two", "three" };
foreach (var name in names)
    {
        CheckBox chb = new CheckBox();
        chb.Content = name;
        chb.Margin = new System.Windows.Thickness { Left = 5, Top = 0, Right = 0, Bottom = 0 };
        synonymsGrid.Children.Add(chb);
    }

上面的代码会将所有复选框设置在一个很明显的位置。我想过使用 for loop 但不确定什么是最好的方法。

解决方案:

for (int i = 0; i < names.Count; i++)
    {
        CheckBox chb = new CheckBox();
        chb.Content = names[i];
        chb.Margin = new System.Windows.Thickness { Left = i * 150, Top = 0, Right = 0, Bottom = 0 };
        synonymsGrid.Children.Add(chb);
    }

当有 Xaml constructs/controls 做同样的事情时,为什么所有这些可视化 GUI 操作都在代码后面?


要在 Xaml 中动态执行此操作...请执行以下步骤。

首先,StackPanel 可以以水平方式均匀地 space 勾出复选框,而不是使用网格,然后将控件边缘化到正确的位置。 请注意,您甚至可以在这里停下来,用 StackPanel 替换您的网格,甚至不需要这个问题

但是,在 Xaml 范例中,是什么让它成为数据驱动(动态)的,它使用 ItemsControl 指定一个 面板 或一个区域是我们的水平 space (StackPanel) 将容纳动态项目。这些动态项目中的每一个都将派生自包含复选框的模板。

例如,要根据您的 Names 列表实现三个复选框,请使用:

只需将您的姓名列表绑定到 ItemsControl,它使用 StackPanelCheckBox 使用 Xaml:

<ItemsControl  ItemsSource="{Binding Names}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <CheckBox Content="{Binding}"
                        Margin="5,0,0,0" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>