Привязка к ActualHeight не работает - PullRequest
2 голосов
/ 24 сентября 2010

Я попытался создать пользовательский элемент управления с полупрозрачным закругленным фоном:

<Canvas>
    <TextBlock x:Name="StopText" Text="Some test text"/>
    <Rectangle Fill="SkyBlue"
               Width="{Binding Source=StopText, Path=ActualHeight}" 
               Height="20"  
               RadiusX="5" RadiusY="5" Opacity="0.2"/>
</Canvas>

Проблема в том, что я не могу, вероятно, связать со свойствами ActualHeight / ActualWidth, причинаони не зависимые.

Что нужно сделать, чтобы сохранить прямоугольник и текстовое поле одинакового размера?

1 Ответ

10 голосов
/ 24 сентября 2010

Правильная привязка должна использовать ElementName, а не Source, при привязке к другому элементу:

<Canvas>
    <TextBlock x:Name="StopText" Text="Some test text"/>
    <Rectangle Fill="SkyBlue"
               Width="{Binding ElementName=StopText, Path=ActualHeight}" 
               Height="20"  
               RadiusX="5" RadiusY="5" Opacity="0.2"/>
</Canvas>

Также вы понимаете, что привязываете ширину Rectangle кHeight из TextBlock, верно?

Если вы действительно хотите настроить свой элемент управления, вам нужно привязать ширину Rectangle к TextBlock s ActualWidth и Height к ActualHeight.

ОБНОВЛЕНИЕ В комментариях ниже приведена реализация, использующая Grid без привязки:

<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
    <TextBlock x:Name="StopText" Text="Some test text"/>
    <Rectangle Fill="SkyBlue"
               HorizontalAlignment="Stretch"
               VerticalAlignment="Stretch"  
               RadiusX="5" RadiusY="5" Opacity="0.2"/>
</Grid>

Grid и Canvas используют различные системы макетов , и поскольку вы не используете функциональность, предоставляемую Canvas, Grid является лучшим выбором.

Большое отличие дочерних элементов заключается в том, что Rectangle теперь просто использует горизонтальный и VerticalAlignment до Stretch по всему Grid, вместо того, чтобы беспокоиться о размерах чего-либо.

...