0
我在StackPanel
内有TextBlock
。由于我使用TextTrimming
,因此我必须根据StackPanel.ActualWidth
手动设置TextBox
的宽度。绑定vs MultiBinding =>不同的结果
<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的渲染制作,和(单)在TextBlok呈现之前进行绑定 – Avlin 2012-01-18 11:47:43
您好,我可能遇到了同样的问题,并且绑定了一个图片源。我发布了一个关于它的主题和一个小项目来测试:http://stackoverflow.com/questions/10128307/special-behavior-of-multibinding-vs-binding-when-specifying-an-imagesource – 2012-04-12 17:04:22