Макет WPF: элементы растут, но не сжимаются правильно

У меня есть следующий код XAML (также заполненный фиктивным содержимым для демонстрации проблемы):

<Window x:Class="WpfWatchBird.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="378" Width="728"
        Name="frmMainList">
    <Grid Name="grdMainLayout">
        <ListBox Name="lstData" SelectionChanged="lstData_SelectionChanged" HorizontalAlignment="Stretch">
            <ListBoxItem HorizontalContentAlignment="Stretch">
                <ListBoxItem.Content>
                    <Grid HorizontalAlignment="Stretch">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="100"/>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="25"/>
                            <RowDefinition Height="100"/>
                            <RowDefinition Height="25"/>
                        </Grid.RowDefinitions>

                        <Label Content="nick" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="Teal" Grid.Column="0" Grid.Row="0" Margin="0" Padding="0"/>
                        <Label Content="kategória" VerticalAlignment="Center" Foreground="Green" Grid.Column="1" Grid.Row="0" Margin="10,0,0,0" Padding="0"/>
                        <Label Content="stav záznamu" Foreground="Gray" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0" Padding="0" Grid.Column="2" Grid.Row="0"/>
                        <Label Content="1.1. 2013 12:00" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,0,5,0" Padding="0" Grid.Column="3" Grid.Row="0"/>

                        <Image HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Column="0" Grid.Row="1" Source="http://www.birdz.sk/la/bezfotky.gif" />
                        <StackPanel x:Name="spItemText" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="3" HorizontalAlignment="Stretch">
                            <TextBlock MaxWidth="{Binding ElementName=spItemText,Path=ActualWidth}" FontSize="18" TextWrapping="Wrap">
                                <TextBlock.Text>Nadpis blogu, konečne, dámy a páni :)</TextBlock.Text>
                            </TextBlock>
                            <TextBlock HorizontalAlignment="Stretch" xml:space="preserve" TextWrapping="Wrap" Margin="10,0,0,0" 
                                       Padding="0" VerticalAlignment="Top"
                                       MaxWidth="{Binding ElementName=spItemText, Path=ActualWidth}">
                                <TextBlock.Text>Preview textu blogu, blablabla, blabla, bude to pekné a krásne
a bude to vedieť robiť aj newliny, len ešte nejak spraviť zarovnanie, aby nebolo... aha, ono nie je, on mi len kvôli xml:space preserve... A už mi aj krásne funguje textwrapping, keď som poodstraňoval zopár nepotrebných
...hmm... tak jeden riadok to wraplo dobre, ale ten ďalší už nie, zaujímavé...
                                </TextBlock.Text>
                            </TextBlock>
                        </StackPanel>
                        <Label Grid.Column="1" Grid.Row="2">
                            <Hyperlink>Otvor originál</Hyperlink>
                        </Label>
                        <Label Grid.Column="3" Grid.Row="2" HorizontalAlignment="Right">
                            <Hyperlink>Otvor zložku so zálohou</Hyperlink>
                        </Label>
                    </Grid>
                </ListBoxItem.Content>
            </ListBoxItem>
            <ListBoxItem Content="Menu 2" />
        </ListBox>
    </Grid>
</Window>

При увеличении окно изменяет размер правильно, но при сжатии отказывается это делать. Я нашел этот вопрос, который кажется очень связанным, но я не считаю ответ там правильным ответом ( также, я не могу комментировать вопросы/ответы, иначе я бы написал это там).

«Ответ» говорит, что по умолчанию ItemsControls предназначены только для роста, но «по умолчанию» предполагает, что есть способ переопределить это, однако ответ не объясняет, как это делается, и я могу ничего не нашел по этому поводу... Есть идеи? Я хотел бы сделать это в XAML, это должно быть возможно без взлома кода, IMO...


person sh code    schedule 06.05.2013    source источник
comment
Попробуйте установить ScrollViewer.HorizontalScrollBarVisibility="Disabled" в списке.   -  person XAMeLi    schedule 07.05.2013
comment
@XAMeLi Большое спасибо, сэр, не могли бы вы снова написать это не как комментарий, а как ответ, чтобы я мог отметить его как правильный?   -  person sh code    schedule 07.05.2013


Ответы (1)


Установите ScrollViewer.HorizontalScrollBarVisibility="Disabled" в списке.

Причина в том, что программа просмотра прокрутки (которая является частью шаблона ListBox) "предпочитает" открывать горизонтальную полосу прокрутки, а не сжимать содержимое.

person XAMeLi    schedule 07.05.2013
comment
Чувак, я потратил полдня, пытаясь переполнить текст TextBlock в TreeViewItem, но безуспешно. Я даже не знал, что искать в Интернете. Я установил ScrollViewer.HorizontalScrollBarVisibility на Hidden вместо Disabled... Огромное спасибо! - person Daniel; 06.06.2013