将一个控件的值传递给转换器以设置另一控件的宽度

2024-03-04

我想根据其容器的宽度设置 TextBlock 的宽度,减去 TextBlock 上设置的边距。

这是我的代码:

<TextBlock x:Name="txtStatusMessages" 
           Width="{Binding ElementName=LayoutRoot,Path=ActualWidth }"
                   TextWrapping="WrapWithOverflow" 
           Foreground="White" 
           Margin="5,5,5,5">This is a message
</TextBlock>

除了由于左右边距 b 设置为 5 而导致 TextBlock 太大 10 个单位之外,效果非常好。

好吧,所以我想......让我们使用转换器。但我不知道如何传递容器控件的 ActualWidth (参见上文:LayoutRoot)。

我知道如何使用转换器,甚至是带有参数的转换器,只是不是像这样的参数... Binding ElementName=LayoutRoot,Path=ActualWidth

例如,我无法使这个工作:

Width="{Binding Converter={StaticResource PositionConverter},  
       ConverterParameter={Binding ElementName=LayoutRoot,Path=ActualWidth }}"

我希望我说得足够清楚,并希望你能提供帮助,因为今晚谷歌对我没有帮助。


您应该使用其他控件作为源,而不是参数。 该参数必须是常量,在您的情况下可以是 -5。

我目前还没接触过 VS,所以语法可能不准确,但是,它是这样的:

Width="{Binding ElementName=LayoutRoot, Path=ActualWidth,
Converter={StaticResource PositionConverter}, ConverterParameter=-5}"

(转换器将接收 -5 作为字符串,并且在使用之前必须将其转换为数字。)

根据我的经验,最好使用 DependecyProperty XXX 的 OnXXXChanged 回调,而不是将同一窗口/根控件中的控件相互绑定。 原因之一是您稍后可能希望将它们绑定到外部元素。

或者,使用多重绑定:

<TextBlock>
    <TextBlock.Width>
        <MultiBinding Converter="{StaticResource yourConverter}">
            <MultiBinding.Bindings>
                <Binding /> <!-- Bind to parameter 1 here -->
                <Binding /> <!-- Bind to parameter 2 here -->
          </MultiBinding.Bindings>
        </MultiBinding>
    </TextBlock.Width>
</TextBlock>

和一个转换器,将两个参数转换为您想要的值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将一个控件的值传递给转换器以设置另一控件的宽度 的相关文章

随机推荐