2015-04-27 122 views
1

我在我的grid上动态创建CheckBoxes。现在我也想动态设置margin(尊重CheckBox),但不确定最好的方法是什么。如何在Silverlight中动态设置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); 
    } 
+0

我找到了解决方案并更新了答案。感谢您的期待。 – CSharper

+0

@OmegaMan感谢您的编辑。下次我会记住这些事情。 – CSharper

回答

3

为什么所有的代码这种视觉GUI操作时,有结构的XAML /控件做同样的事情的背后?


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

首先,StackPanel可以水平方式均匀分隔复选框,而不是使用网格,然后将控件限制在正确的位置。 注意,你甚至可以停在这里,并用StackPanel更换你的网格,甚至没有必要为这个问题

但令在XAML模式驱动(动态)它的数据,一个使用ItemsControl指定一个面板或将成为我们的水平空间(StackPanel),将保存动态项目的区域。这些动态项目中的每一个都将从包含复选框的模板派生。

例如实现基于关闭您Names名单的三个复选框使用此:

enter image description here

你的名字的列表简单地绑定到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>