Проблема макета WPF с вложенным StackPanel, выходящим за пределы родительского StackPanel - PullRequest
0 голосов
/ 06 августа 2010

У меня есть горизонтальная StackPanel с изображением и еще одна StackPanel. Внутренняя панель StackPanel является вертикальной с двумя текстовыми блоками, для каждого из которых TextWrapping имеет значение Wrap. Однако, когда текст становится широким, внутренняя панель StackPanel увеличивается в ширину, так что текстовые блоки не переносятся. Внешняя панель StackPanel остается с пространством макета сетки, которое ей было дано. Как сделать так, чтобы внутренняя панель StackPanel оставалась в пределах границ внешней панели StackPanel?

Вот соответствующий раздел XAML:

    <StackPanel Name="_imageAndNameStackPanel"
               Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3" 
               Orientation="Horizontal"  Margin="12,12,12,0">
        <Image Name="_applicationImage" Source="{Binding Path=ImageUri}" 
               Stretch="Fill" Height="64" Width="64" HorizontalAlignment="Left"
               VerticalAlignment="Top" Margin="0,0,12,0" />
        <StackPanel Name="_nameStackPanel">
            <TextBlock Name="_nameTextBlock" Text="{Binding Path=AppName}" 
                 FontSize="24" VerticalAlignment="Top" TextWrapping="Wrap"/>
            <TextBlock Name="_subtitleTextBlock" Text="{Binding Path=Subtitle"
                 FontSize="18" VerticalAlignment="Top" Margin="0,6,0,0" 
                 TextWrapping="Wrap"/>
        </StackPanel>
    </StackPanel>

Ответы [ 3 ]

4 голосов
/ 06 августа 2010

Вам, вероятно, лучше с DockPanel вместо StackPanel.

<StackPanel Name="_imageAndNameStackPanel"
           Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3" 
           Orientation="Horizontal"  Margin="12,12,12,0">
    <Image Name="_applicationImage" Source="{Binding Path=ImageUri}" 
           Stretch="Fill" Height="64" Width="64" HorizontalAlignment="Left"
           VerticalAlignment="Top" Margin="0,0,12,0" />
    <DockPanel Name="_nameStackPanel">
        <TextBlock Name="_nameTextBlock" Text="{Binding Path=AppName}" 
             FontSize="24" VerticalAlignment="Top" TextWrapping="Wrap" 
             DockPanel.Dock="Top" />
        <TextBlock Name="_subtitleTextBlock" Text="{Binding Path=Subtitle"
             FontSize="18" VerticalAlignment="Top" Margin="0,6,0,0" 
             TextWrapping="Wrap" DockPanel.Dock="Top"/>
    </DockPanel>
</StackPanel>

В последнее время я обнаружил, что в 2 из 3 раз, когда я начинаю с StackPanel, я получаюизменив его на DockPanel.

Но ... вы уверены , что внешний StackPanel не выходит за пределы своей ячейки сетки?Возможно, вы захотите сделать его также DockPanel, так как и Image, и внутренний DockPanel имеют DockPanel.Dock="Left".

0 голосов
/ 06 августа 2010

Вы можете привязать ширину вашей внутренней StackPanel к ширине родительской StackPanel.Что-то вроде:

{Binding RelativeSource={RelativeSource AncestorType={x:Type StackPanel}}, Path=Width}

0 голосов
/ 06 августа 2010

Дайте вашей внутренней панели стека или текстового блока фиксированную ширину.

...