web-dev-qa-db-ja.com

silverlightで子要素の幅を親要素の幅にバインドする方法

幅が「1 *」のグリッドがあります。したがって、実際の幅は実行時に決定されます。そのグリッド内に、親グリッドのランタイム幅に設定したい幅を持つ別のグリッドがあります。バインディングによってxamlでそれを行うにはどうすればよいですか。

これは実際にあなたを助けるでしょう

Width="{Binding ActualWidth, ElementName=parentElementName}"

これにより、幅が親要素または指定された要素名にバインドされます

105
Anobik

これはどこでも機能する一般的なソリューションです。親要素名を記述する必要はありません。これは親を識別し、親の幅を取ります。

Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ActualWidth}"
29
Rudresh Bhatt

同じことをする最も簡単な方法は次のとおりです:

HorizontalAlignment="Stretch"

それはあなたが尋ねられたようにバインディングを使用していませんが、それは簡単です。

20
RockLegend

あなたがCodeBehindでそれをしているなら、これは私のために機能します。 bindMeがtoMeの子である必要がないという追加の利点があります。

public static void BindWidth(this FrameworkElement bindMe, FrameworkElement toMe)
{
  Binding b = new Binding();
  b.Mode = BindingMode.OneWay;
  b.Source = toMe.ActualWidth;
  bindMe.SetBinding(FrameworkElement.WidthProperty, b);
}

使用法:

child.BindWidth(parent);
3
 Width="{Binding Width, RelativeSource={RelativeSource AncestorType={x:Type Parent}, Mode=FindAncestor}}"

両方のコントロールDataContextが異なる場合。

2
Gaurav Panwar

テンプレート内にある場合、これを使用します。

<ListBox>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Vertical">
                <Image Width="{TemplateBinding Width}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Source="TestImage.png"/>
                <TextBlock HorizontalAlignment="Center" Text="Test Text"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
0