如何在 Silverlight 中动态设置复选框边距
How to set CheckBox margin dynamically in Silverlight
我正在 grid
上动态创建 CheckBoxes
。现在我也想动态设置 margin
(尊重 CheckBox
)但不确定什么是最好的方法。
例如,
- 如果只有一个
CheckBox
那么margin
应该是{5,0,0,0}
- 如果有 两个
CheckBoxes
那么第一个应该有 {5,0,0,0}
第二个应该有 {10,0,0,0}
等等。
我担心左边距。这些复选框的创建基于 List<String>
.
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
,它使用 StackPanel
和 CheckBox
使用 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>
我正在 grid
上动态创建 CheckBoxes
。现在我也想动态设置 margin
(尊重 CheckBox
)但不确定什么是最好的方法。
例如,
- 如果只有一个
CheckBox
那么margin
应该是{5,0,0,0}
- 如果有 两个
CheckBoxes
那么第一个应该有{5,0,0,0}
第二个应该有{10,0,0,0}
等等。 我担心左边距。这些复选框的创建基于List<String>
.
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
,它使用 StackPanel
和 CheckBox
使用 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>