如何在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】:
HorizontalAlignment 不适用于 Xamarin 中的按钮,您可以改用 HorizontalOptions
HorizontalOptions="Fill"
【讨论】:
【参考方案2】:在 ListBox 上使用 HorizontalContentAlignment="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"
这不是像你被问到的那样使用绑定,但它更容易。
【讨论】:
满足我的需要要容易得多:将它们放入网格中,使用列定义控制宽度,HorizontalAlignment = Stretch,Profit。谢谢。 这样做的缺点似乎是:<ColumnDefinition Width="Auto" />
、<ColumnDefinition Width="Auto" />
等列定义的组合不会尊重中间列缺少 Auto 属性
在网格单元的垂直堆栈面板中运行良好。【参考方案7】:
我猜这实际上会帮助你
Width="Binding ActualWidth, ElementName=parentElementName"
这会将宽度绑定到父元素或提供的元素名称
【讨论】:
什么是 IntelIsense 未建议的 ActualWidth 属性? 将宽度绑定到父宽度似乎消除了通过ItemsSource
更新内容的能力。见the strange behaviour in this question。以上是关于如何在silverlight中将子元素的宽度绑定到父元素的宽度的主要内容,如果未能解决你的问题,请参考以下文章
将 Silverlight UserControl 自定义属性绑定到其元素
TextBlock 不包装 Silverlight 应用程序
Silverlight 组合框 SelectedItem 绑定问题