0

コンテナーに並べて配置する必要がある 2 つの Silverlight UserControls があります。それらのいずれかがオプションで存在 (表示) され、1 つが欠落している場合は、残りの 1 つがコンテナーの幅 100% になるようにします。基本的に 4 つの状態があります。2 つのコントロールのいずれも存在しない場合、コンテナーは折りたたまれています。他はこんな 感じ

これまでのところ、2列のグリッドを使用しています

<Grid>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto" />
    <ColumnDefinition Width="*"/>
  </Grid.ColumnDefinitions>
  <userControls:LeftControl Grid.Column="0" ...></userControls:LeftControl>
  <userControls:RightControl Grid.Column="1" ...></userControls:RightControl>
</Grid>

右のコントロールがない場合を除いて、これは正常に機能します。左は伸びません。

4

1 に答える 1

1

Silverlightレイアウトシステムがそれ自体でこれを理解できるとは思いません。

このようなものがあなたの答えに近づくかどうかを確認してください。

マークアップ:

<Grid x:Name="LayoutRoot" Background="White">
    <StackPanel Orientation="Vertical" Width="400" Height="200" Background="Fuchsia">
        <Grid x:Name="ContainerGrid" Height="100" Background="Green">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Border x:Name="LeftControl" Grid.Column="0" Background="Red" LayoutUpdated="LeftControl_LayoutUpdated"></Border>
            <Border x:Name="RightControl" Grid.Column="1" Background="Blue" LayoutUpdated="RightControl_LayoutUpdated"></Border>
        </Grid>
        <Button x:Name="ToggleLeft" Content="Toggle Left" Click="ToggleLeft_Click"></Button>
        <Button x:Name="ToggleRight" Content="Toggle Right" Click="ToggleRight_Click"></Button>
    </StackPanel>
</Grid>

背後にあるコード:

public partial class MainPage : UserControl
{
    public MainPage()
    {
        InitializeComponent();
    }

    private void ToggleLeft_Click(object sender, RoutedEventArgs e)
    {
        LeftControl.Visibility = 
            LeftControl.Visibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
    }

    private void ToggleRight_Click(object sender, RoutedEventArgs e)
    {
        RightControl.Visibility = 
            RightControl.Visibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
    }

    private void LeftControl_LayoutUpdated(object sender, EventArgs e)
    {
        ContainerGrid.ColumnDefinitions[0].Width =
            ContainerGrid.Children.Any(
                x => (int)x.GetValue(Grid.ColumnProperty) == 0 && x.Visibility == Visibility.Visible)
                ? new GridLength(1, GridUnitType.Star)
                : GridLength.Auto;
    }

    private void RightControl_LayoutUpdated(object sender, EventArgs e)
    {
        ContainerGrid.ColumnDefinitions[1].Width =
            ContainerGrid.Children.Any(
                x => (int)x.GetValue(Grid.ColumnProperty) == 1 && x.Visibility == Visibility.Visible)
                ? new GridLength(1, GridUnitType.Star)
                : GridLength.Auto;
    }
}
于 2012-09-06T20:33:29.833 に答える