Выровняйте центр, пока не будет достаточно места WPF - PullRequest
1 голос
/ 06 апреля 2020

Я имею в виду определенное поведение макета и хочу посмотреть, сможет ли кто-нибудь придумать простой способ сделать это, прежде чем я попытаюсь написать собственную панель или что-то в этом роде. Взгляните на эту анимацию, которую я собрал вручную:

Shrinking example animation

В дальнем левом углу есть элемент фиксированной ширины (прямоугольник), а затем второй элемент с центром - не внутри оставшегося пространства, а относительно всего контейнера. Когда контейнер сжимается, центрированный элемент остается центрированным , пока левый элемент не окажется слишком близко. Вместо того, чтобы оставаться прямо посередине, «центрированный» элемент теперь остается как можно ближе к центру без наложения . Это поведение, которое я хочу.

Используя Grid, я могу сделать что-то вроде этого:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>

    <Border Width="100" Background="Green"/>

    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Grid.ColumnSpan="2" FontSize="24" Margin="2, 0">Centered Text</TextBlock>
</Grid>

, который помещает все в нужное место, но TextBlock запустится перекрываются с Border вместо того, чтобы двигаться дальше вправо.

Так есть идеи, как мне заставить это делать то, что я хочу?

1 Ответ

2 голосов
/ 06 апреля 2020

Попробуйте:

Имя окна x:Name="window1"

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>

    <Border x:Name="border1" Width="100" Background="Green"/>

    <TextBlock x:Name="textBlock1" HorizontalAlignment="Center" VerticalAlignment="Center"  FontSize="24"    Grid.ColumnSpan="2">Centered Text</TextBlock>
</Grid>

Событие SizeChanged

     private void Window1_SizeChanged(object sender, SizeChangedEventArgs e) {
        if(( ( window1.Width / 2 ) - ( textBlock1.ActualWidth / 2 ) - border1.Width - ( SystemParameters.ResizeFrameVerticalBorderWidth * 2 ) ) <= 0) {
            Grid.SetColumn(textBlock1, 1);
            textBlock1.HorizontalAlignment = HorizontalAlignment.Left;

        } else {
            Grid.SetColumn(textBlock1, 0);
            textBlock1.HorizontalAlignment = HorizontalAlignment.Center;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...