通过父控件(而不是内容)设置元素的宽度

时间:2012-01-08 14:05:20

标签: wpf

考虑以下用户控件,这是我的会话控件的一个简化版本。我有麻烦修复文本块控件的宽度(包含对话的内容)到容器控件的容器。 我得到的是一个没有换行的TextBlock控件。

如果我硬设置TextBlock控件的宽度,或者包含DockPanel(例如将DockPanel替换为注释中的那个),一切都会更好,尽管我还需要添加一个转换器来减去边距。

我见过很多类似的问题,包括在这个网站上,但没有明确的答案。 {Binding}到父元素的ActualWidth对我来说似乎很尴尬。

<UserControl 
    x:Class="Bar.View.test"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" d:DesignHeight="800" d:DesignWidth="240"
    >
    <UserControl.Resources>
        <XmlDataProvider x:Key="Conversation" XPath="Discussion">
            <x:XData>
                <Discussion xmlns="">
                    <msg speaker="Mark" picture="http://graph.facebook.com/4/picture?type=small">Hello</msg>
                    <msg speaker="Uri" picture="http://graph.facebook.com/526439429/picture?type=normal">Good Morning</msg>
                    <msg speaker="Mark" picture="http://graph.facebook.com/4/picture?type=small">The quick brown fox jumps over the lazy dog</msg>
                </Discussion>
            </x:XData>
        </XmlDataProvider>
    </UserControl.Resources>

    <ListBox x:Name="lb"
        ItemsSource="{Binding Source={StaticResource Conversation},XPath=*}"
        HorizontalContentAlignment="Stretch"
        >

        <ListBox.ItemTemplate>
            <DataTemplate>
                <!-- <DockPanel LastChildFill="True" Width="{Binding ElementName=lb,Path=ActualWidth}"> -->
                <DockPanel LastChildFill="True">
                    <StackPanel DockPanel.Dock="Left" Orientation="Vertical" Width="40" Margin="2">
                        <Image Source="{Binding XPath=@picture}" />
                        <TextBlock Text="{Binding XPath=@speaker}" FontSize="8"/>
                    </StackPanel>

                    <Border BorderThickness="1" BorderBrush="Blue" CornerRadius="8" Padding="3" Margin="2" >
                        <TextBlock Text="{Binding XPath=.}" TextWrapping="Wrap" />
                    </Border>

                </DockPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

</UserControl>

1 个答案:

答案 0 :(得分:1)

我已经使用您的代码创建了一个repro,并且在列表框中可以看到水平滚动条,这就是为什么TextBox不会变形,因为列表框的ScrollViewer允许它无限扩展。

尝试在ScrollViewer.HorizontalScrollBarVisibility="Disabled"上设置ListBox,它会正确地包装文本。