【发布时间】:2012-01-18 11:42:29
【问题描述】:
我在StackPanel 中有一个TextBlock。由于我使用的是TextTrimming,所以我必须根据StackPanel.ActualWidth 手动设置TextBox 的宽度。
<StackPanel HorizontalAlignment="Stretch">
<TextBlock HorizontalAlignment="Left">
<TextBlock.Width>
<MultiBinding Converter="{StaticResource WidthConverter}">
<MultiBinding.Bindings>
<Binding RelativeSource="{RelativeSource Self}" />
<Binding RelativeSource="{x:Static RelativeSource.Self}" Path="TemplatedParent.Parent.ActualWidth" />
</MultiBinding.Bindings>
</MultiBinding>
</TextBlock.Width>
</TextBlock>
我的转换器:
Public Class WidthConverter
Implements IMultiValueConverter
Public Function Convert(ByVal values() As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IMultiValueConverter.Convert
Const TextBoxMarginRight As Double = 5
Dim ParentWidth As Double = CType(CType(values(0), FrameworkElement).Parent, FrameworkElement).ActualWidth
Dim ParentRelativeControlPosition As Point = CType(values(0), FrameworkElement).TransformToAncestor(CType(CType(values(0), FrameworkElement).Parent, Media.Visual)).Transform(New Point(0, 0))
Dim Width As Double = ParentWidth - TextBoxMarginRight - ParentRelativeControlPosition.X
If Width > 5 Then
Return Width
Else
Return 0
End If
End Function
为什么这是正常工作而不是下面的代码? (使用具有相同代码的IValueConverter):
我的转换器可以得到StackPanel 但ActualWidth 始终为零
<TextBlock.Width>
<Binding RelativeSource="{x:Static RelativeSource.Self}" Path="TemplatedParent.Parent.ActualWidth" Converter="{StaticResource WidthConverter}" />
</TextBlock.Width>
【问题讨论】:
-
我认为 MultiBinding 是在 TextBlock 渲染之后进行的,并且(单个)Binding 在 TextBlok 渲染之前进行
-
您好,我可能遇到了同样的问题,绑定到图像源。我发了一个关于它的话题和一个小项目来测试:stackoverflow.com/questions/10128307/…