VerticalAlignment = "Растянуть" для метки внутри холста не работает - PullRequest
4 голосов
/ 28 июня 2011

Как использовать VerticalAlignment="Stretch" с Label внутри Canvas?Я пытаюсь центрировать текст «Отмена» на кнопке, как в коде ниже.Использовать фиксированную высоту и ширину для метки нежелательно.

<Button Name="buttonCancel" Width="80" Height="40" IsCancel="True" Padding="0" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
    <Canvas>
        <Label Canvas.Top="0" Canvas.Left="0" Padding="0" FontSize="10">Esc</Label>
        <Label VerticalContentAlignment="Center" HorizontalContentAlignment="Center" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">Cancel</Label>
    </Canvas>
</Button>

Ответы [ 4 ]

6 голосов
/ 28 июня 2011

Используйте привязку к Canvas 'ActualWidth:

<Canvas>
    <Label Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type Canvas}}, Path=ActualWidth}">...</Label>
</Canvas>

Но, как уже упоминалось выше, если вы заинтересованы в макетах с динамическим растяжением, Canvas не является идеальным выборомуправление.

1 голос
/ 28 июня 2011

Предполагая, что вам нужен холст для других объектов фиксированной природы, вы можете наложить Canvas на Grid, а затем поместить метки в сетку.Вы можете поместить метки перед холстом, чтобы сделать их фоновым z-индексом (перезаписанным объектами холста), или после холста, чтобы сделать их более высоким z-индексом (перезапишут объекты холста).Например:

<Button Name="buttonCancel" Width="80" Height="40" IsCancel="True" Padding="0" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
    <Grid>
        <Label Padding="0" FontSize="10">Esc</Label>
        <Label VerticalContentAlignment="Center" HorizontalContentAlignment="Center" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">Cancel</Label>
        <Canvas>
            <!-- Your Canvas content here -->
        </Canvas>
    </Grid>
</Button>
1 голос
/ 28 июня 2011

A Canvas не выполняет масштабирование макета своего содержимого;если вы хотите масштабировать содержимое, вы можете использовать Grid в этом случае, который по умолчанию будет масштабировать оба элемента Label, чтобы заполнить пространство Content.

0 голосов
/ 30 июня 2011

Повторяю моё решение из комментариев, так как (а) вы действительно не хотите Canvas и (б), похоже, это решило ваши проблемы, поэтому я сделаю ответ, где оно будет более заметным другим.

Canvas предназначен для макетов с фиксированным размером пикселя, что, вероятно, является наименее распространенным случаем. Вам следует заменить Canvas на Grid, как показано ниже, чтобы оба Label динамически (и независимо) располагались в пределах доступного пространства:

<Grid>
    <Label Padding="0" FontSize="10">Esc</Label>
    <Label VerticalAlignment="Center" HorizontalAlignment="Center">Cancel</Label>
</Grid>
...