2015-04-27 35 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>