我有3 * 3的網格,並有9個按鈕。這些按鈕可用性是在運行時確定的,因此按鈕必須安排在可用空間內。在網格中自動更新按鈕的位置wpf
例如:
B1,B2,B3
B4 B5 B6
B7 B8 B9
如果B5按鈕不可用,那麼我必須做這樣的
B1,B2, b3
b4 b6 b7
b8 b9
當前在可見性更新處理程序中,我檢查所有控件狀態並更改grid.row和grid.column。有沒有更好的方法來做到這一點?
我有3 * 3的網格,並有9個按鈕。這些按鈕可用性是在運行時確定的,因此按鈕必須安排在可用空間內。在網格中自動更新按鈕的位置wpf
例如:
B1,B2,B3
B4 B5 B6
B7 B8 B9
如果B5按鈕不可用,那麼我必須做這樣的
B1,B2, b3
b4 b6 b7
b8 b9
當前在可見性更新處理程序中,我檢查所有控件狀態並更改grid.row和grid.column。有沒有更好的方法來做到這一點?
繼Bala R的回答之後,似乎您正試圖實施您自己的WrapPanel。
在WrapPanel中內置了這樣的功能,可以自動重新排列您的控件「從左到右,然後從上到下」或「從上到下然後從左到右」。那麼你不需要「觀察」你的按鈕的可見性了,因爲一旦不可見(摺疊),其他人立即佔據之後佔用的位置,然後再按照上述模式。
這裏是一個快速和骯髒的樣本來說明,隨時與WrapPanel方向發揮和摺疊/隱藏按鈕狀態:
XAML:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="31*" />
<RowDefinition Height="731*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="284*" />
<ColumnDefinition Width="294*" />
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal" VerticalAlignment="Top">
<Button x:Name="hideBtn" Content="HIDE button #" Click="hideBtn_Click"></Button>
<TextBox x:Name="buttonNumber" Width="50"></TextBox>
<RadioButton x:Name="radioCollapsed" Content="Collapsed" IsChecked="True"></RadioButton>
<RadioButton x:Name="radioHidden" Content="Hidden"></RadioButton>
</StackPanel>
<WrapPanel x:Name="wp" Orientation="Horizontal" Grid.Row="1" VerticalAlignment="Top" HorizontalAlignment="Left" Height="74" Width="61">
<Button x:Name="b_1" Content="B1"></Button>
<Button x:Name="b_2" Content="B2"></Button>
<Button x:Name="b_3" Content="B3"></Button>
<Button x:Name="b_4" Content="B4"></Button>
<Button x:Name="b_5" Content="B5"></Button>
<Button x:Name="b_6" Content="B6"></Button>
<Button x:Name="b_7" Content="B7"></Button>
<Button x:Name="b_8" Content="B8"></Button>
<Button x:Name="b_9" Content="B9"></Button>
</WrapPanel>
</Grid>
後面的代碼:
private void hideBtn_Click(object sender, RoutedEventArgs e)
{
foreach (var child in wp.Children)
{
var btn = (Button)child;
btn.Visibility = Visibility.Visible;
}
foreach (var child in wp.Children)
{
var btn = (Button)child;
if (btn.Name.Contains(buttonNumber.Text))
{
if (radioCollapsed.IsChecked.Value)
btn.Visibility = Visibility.Collapsed;
else
btn.Visibility = Visibility.Hidden;
}
}
}
嘗試使用UniformGrid並將列和行設置爲3.它將自動按照剛描述的方式填充網格。
你考慮過[WrapPanel](http://msdn.microsoft.com/en-us/library/system.windows.controls.wrappanel.aspx)而不是網格嗎? – 2011-05-05 12:22:42
@Bala +1這似乎正是一個包裝面板 – Bruno 2011-05-05 12:26:56