2010-09-24 3 views
2

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

<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 свойств, причиной они не являются зависимыми.

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

ответ

10

Правильное связывание использовать 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 «Ширина s к TextBlock» s ActualWidth и Height к ActualHeight.

UPDATE Per комментариев ниже, здесь является реализацией с использованием 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 и Canvasuse different layout systems, и так как вы не используете функциональные Canvas обеспечивает, Grid это лучший выбор.

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

+0

Хорошее наблюдение за ElementName. Что делать, если я хотел бы привязать его к самому холсту (основному элементу UserControl). Что я должен установить? – serhio

+0

Я бы просто использовал Grid вместо Canvas, и тогда вам вообще не нужно привязывать. Я уточню свой ответ. –

+0

Хмм ... С Canvas я использовал 'this.SetValue (Canvas.LeftProperty', чтобы установить местоположение UserControl (внутри UserControl). Как мне теперь сделать, с помощью Grid? – serhio