2012-01-18 36 views
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):

我的转换器可以得到StackPanelActualWidth始终为零

<TextBlock.Width> 

    <Binding RelativeSource="{x:Static RelativeSource.Self}" Path="TemplatedParent.Parent.ActualWidth" Converter="{StaticResource WidthConverter}" />   
</TextBlock.Width> 
+0

我认为MultiBinding之后TextBlock的渲染制作,和(单)在TextBlok呈现之前进行绑定 – Avlin 2012-01-18 11:47:43

+0

您好,我可能遇到了同样的问题,并且绑定了一个图片源。我发布了一个关于它的主题和一个小项目来测试:http://stackoverflow.com/questions/10128307/special-behavior-of-multibinding-vs-binding-when-specifying-an-imagesource – 2012-04-12 17:04:22

回答

0

尝试

Width="{Binding Path=ActualWidth, 
       RelativeSource={RelativeSource FindAncestor, AncestorType=StackPanel}}" 
相关问题