在stackpanel中使用wpf textblock自动调整大小/布局

时间:2009-12-03 14:54:30

标签: wpf xaml layout textblock stackpanel

我有以下堆栈面板

<StackPanel>
                <TextBlock Text="{Binding AddressLine1}" />
                <TextBlock Text="{Binding AddressLine2}" />
                <TextBlock Text="{Binding AddressLine3}"  />
                <TextBlock Text="{Binding AddressLine4}"  />
</StackPanel>

并且我的AddressLine2字符串在绑定对象上为null。

我的堆栈面板呈现类似

| AddressLine1 |
|              |
| AddressLine3 |
| AddressLine4 |

但我希望它像

一样呈现
| AddressLine1 |
| AddressLine3 |
| AddressLine4 |

这是可能的,还是我错过了一种明显的方法呢?

谢谢, 克里斯

3 个答案:

答案 0 :(得分:2)

创建一个实现IMultiValueConverter的转换器,然后在文本上使用MultiBinding,这样每行只有一个TextBlock,如下所示:

class MultiStringConverter : IMultiValueConverter
{
    public object Convert( object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture )
    {
        var text = new StringBuilder( );
        for ( int i = 0 ; i < values.Length ; i++ ) {
            string line = String.Format( "{0}", values[i] );
            if ( !String.IsNullOrEmpty( line ) ) {
                text.AppendLine( line );
            }   // if
        }
        return text.ToString( );
    }

    public object[] ConvertBack( object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture )
    {
        throw new NotImplementedException( );
    }
}

在XAML ......

    <TextBlock>
        <TextBlock.Text>
            <MultiBinding>
                <MultiBinding.Converter>
                    <Local:MultiStringConverter />
                </MultiBinding.Converter>
                <Binding Path="AddressLine1" />
                <Binding Path="AddressLine2" />
                <Binding Path="AddressLine3" />
                <Binding Path="AddressLine4" />
            </MultiBinding>
        </TextBlock.Text>
    </TextBlock>

答案 1 :(得分:0)

您可以使用ValueConverter

将TextBlock的可见性绑定到Text属性

答案 2 :(得分:0)

您可以使用Trigger for TextBlock检查Text是否为null,并在这种情况下将Visibility设置为Collapsed。

相关问题