如何在silverlight中将子元素的宽度绑定到父元素的宽度

Posted

技术标签:

【中文标题】如何在silverlight中将子元素的宽度绑定到父元素的宽度【英文标题】:how to bind width of child element to width of parent element in silverlight 【发布时间】:2013-09-22 18:37:26 【问题描述】:

我有一个宽度为“1*”的网格。所以我认为实际宽度是在运行时决定的。 在该网格中,我有另一个网格,我想将其宽度设置为父网格的运行时宽度。如何通过绑定在 xaml 中做到这一点。

【问题讨论】:

不需要这样做。网格会自动调整其子网格的大小,包括子网格。当你说你有一个宽度为1* 的网格时,你肯定是指一个网格列,不是吗?您可以发布您的 XAML 以明确您实际在做什么。 【参考方案1】:

Horizo​​ntalAlignment 不适用于 Xamarin 中的按钮,您可以改用 Horizo​​ntalOptions

HorizontalOptions="Fill"

【讨论】:

【参考方案2】:

在 ListBox 上使用 Horizo​​ntalContentAlignment="Stretch":

<ListBox HorizontalContentAlignment="Stretch">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Vertical">
                <Image HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Source="TestImage.png"/>
                <TextBlock HorizontalAlignment="Center" Text="Test Text"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

或者如果它在模板中,请使用:

<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>

【讨论】:

【参考方案3】:
 Width="Binding Width, RelativeSource=RelativeSource AncestorType=x:Type Parent, Mode=FindAncestor"

如果两个控件的DataContext不同。

【讨论】:

我得到“WPF 项目不支持父级” 是的,WPF 项目不支持 Parent,它是用于 silverlight。对于 WPF,您可以使用实际的父控件,如 UserControl、DataGrid 和 Window 等,而不是 Parent。【参考方案4】:

这是一个通用的解决方案,可以在任何地方使用。您不需要编写父元素名称。这将识别其父级并采用父级的宽度。

Width="Binding RelativeSource=RelativeSource TemplatedParent, Path=ActualWidth"

【讨论】:

【参考方案5】:

如果您在 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);

【讨论】:

【参考方案6】:

我认为做同样事情的最简单方法是:

HorizontalAlignment="Stretch"

这不是像你被问到的那样使用绑定,但它更容易。

【讨论】:

满足我的需要要容易得多:将它们放入网格中,使用列定义控制宽度,Horizo​​ntalAlignment = Stretch,Profit。谢谢。 这样做的缺点似乎是:&lt;ColumnDefinition Width="Auto" /&gt;&lt;ColumnDefinition Width="Auto" /&gt; 等列定义的组合不会尊重中间列缺少 Auto 属性 在网格单元的垂直堆栈面板中运行良好。【参考方案7】:

我猜这实际上会帮助你

Width="Binding ActualWidth, ElementName=parentElementName"

这会将宽度绑定到父元素或提供的元素名称

【讨论】:

什么是 IntelIsense 未建议的 ActualWidth 属性? 将宽度绑定到父宽度似乎消除了通过ItemsSource 更新内容的能力。见the strange behaviour in this question。

以上是关于如何在silverlight中将子元素的宽度绑定到父元素的宽度的主要内容,如果未能解决你的问题,请参考以下文章

将 Silverlight UserControl 自定义属性绑定到其元素

TextBlock 不包装 Silverlight 应用程序

Silverlight 组合框 SelectedItem 绑定问题

Silverlight 如何将属性绑定到列表项值

使用自动布局,如何在 NSSplitView 中将子视图居中而不强制宽度 NSSplitView 为静态?

增加 Silverlight DataGrid 中的列宽以填充整个 DG 宽度