Silverlight 4: StackPanel не изменяет размер, когда содержимое становится более узким

Я использую Silverlight 4 с Blend 4.

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

Когда я добавляю текст в текстовые поля, размер текстового поля увеличивается, как и панель стека. Все идет нормально.

Когда я удаляю текст из текстовых полей, размер текстового поля уменьшается (за исключением случаев), а размер панели стека - нет.

Есть ли какой-нибудь трюк, чтобы изменить размер панели стека, когда содержимое (текстовые поля) становится меньше?

Заранее спасибо, Фрэнк

Вот XAML для UserControl:

<Grid x:Name="LayoutRoot">
  <StackPanel x:Name="StackPanelBorder" Orientation="Horizontal">
    <TextBox x:Name="TextBoxCharacteristicName" TextWrapping="Wrap" Text="Tex">
        </TextBox>
    <TextBox x:Name="TextBoxSep" TextWrapping="Wrap" Text="=" IsReadOnly="True">
        </TextBox>
    <Button x:Name="ButtonRemove" Content="-" Click="ButtonAddOrRemove_Click">
        </Button>
  </StackPanel>
</Grid>

person Aaginor    schedule 22.06.2010    source источник


Ответы (4)


Если вы хотите, чтобы размер StackPanel изменялся по горизонтали вместе с элементами внутри него, вам нужно будет изменить HorizontalAlignment со значения по умолчанию «Растянуть» на другое.

По умолчанию панель стека растягивается, чтобы заполнить все пространство своего родительского элемента управления, поскольку для HorizontalAlignment задано значение stretch. Это затрудняет его рост и уменьшение в размерах.

Вы захотите установить HorizontalAlignment в «Left», «Right» или «Center». Тогда ширина стековой панели будет равна ширине элементов внутри нее. Но выбирайте с умом, потому что тогда стековая панель будет стыковаться с этой позицией внутри своего родительского элемента управления.

<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">

Примечание. Если это не решает вашу проблему, значит, проблема связана с родительским элементом управления, а не с вашей StackPanel.

Веб-сайт MSDN для HorizontalAlignment

person Jeremiah    schedule 22.06.2010
comment
Дальнейшие тесты показали (я поставил очень красивые цвета фона для каждого элемента управления), что проблема отсутствия сжатия связана со списком, содержащим UserControls. Я обернул UserControls в ListBoxItems, чтобы иметь возможность устанавливать HorizontalAlignment для элементов списка (и теперь они соответственно сжимаются). Я также установил HA для ListBox на .Left (как я делал почти со всеми элементами управления). Тем не менее, никакого сжатия ListBox при сжатии ListBoxItems. - person Aaginor; 23.06.2010
comment
Попался. Это похоже на возможность задать еще один вопрос о StackOverflow. Мне нужно увидеть код. Есть две вещи, которые вы можете переопределить, одна из которых - ItemsPanel ListBox, а другая - ItemContainerStyle. Еще раз .. Мне нужно было бы увидеть больше кода. - person Jeremiah; 23.06.2010
comment
Привет Иеремия. Я воспользовался возможностью и задал здесь новый вопрос: stackoverflow.com/questions/3110159/ Если вам нужно больше кода, просто дайте мне знать. В любом случае спасибо, Фрэнк! - person Aaginor; 24.06.2010

Для этого лучше использовать Grid. Просто создайте Grid с 3 автоматическими столбцами, и он будет соответствовать размеру содержимого.

<Grid x:Name="LayoutRoot">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    <TextBox x:Name="TextBoxCharacteristicName" TextWrapping="Wrap" Text="Tex" Grid.Column="0"/>
    <TextBox x:Name="TextBoxSep" TextWrapping="Wrap" Text="=" IsReadOnly="True" Grid.Column="1"/>
    <Button x:Name="ButtonRemove" Content="-" Click="ButtonAddOrRemove_Click" Grid.Column="2"/>
</Grid>

В большинстве случаев вам будет гораздо лучше использовать Grid. StackPanel - полезный элемент управления, но я часто чувствую, что им злоупотребляют.

person Stephan    schedule 22.06.2010

Я изменил ваш код, как показано ниже. Пожалуйста, проверьте.

<Grid x:Name="LayoutRoot">
  <ScrollViewer x:Name="PageScrollViewer" >
  <toolkit:WrapPanel x:Name="mywrapPanel" Orientation="Vertical" Width="{Binding ActualWidth, ElementName=LayoutRoot}">
    <TextBox x:Name="TextBoxCharacteristicName" TextWrapping="Wrap" Text="Tex" Width="{Binding ActualWidth, ElementName=mywrapPanel}">
        </TextBox>
    <TextBox x:Name="TextBoxSep" TextWrapping="Wrap" Text="=" IsReadOnly="True" Width="{Binding ActualWidth, ElementName=mywrapPanel}">
        </TextBox>
    <Button x:Name="ButtonRemove" Content="-" Click="ButtonAddOrRemove_Click" HorizontalAlignment="Right" Width="80" Margin="2">
        </Button>
  </toolkit:WrapPanel>
  </ScrollViewer>
</Grid>

Если вы используете Horizontal в ориентации WrapPanel, вам, возможно, придется использовать привязку свойства Height с ActualHeight. "набор инструментов" можно включить в заголовок как xmlns: toolkit = "http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit" Надеюсь, это поможет.

person Venkat    schedule 18.02.2015

вам нужно что-то вроде:

<StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch">

Кроме того, я не думаю, что растягивающее текстовое поле - хорошая идея, если только это не является обязательным требованием. Вы должны указать ширину текстового поля, чтобы оно не растягивалось.

Кроме того, если вышеуказанное решение не работает, вам следует опубликовать свой xaml, чтобы мы могли увидеть структуру документа.

person VoodooChild    schedule 22.06.2010
comment
HorizontalAlignment = Stretch является стандартным для StackPanel, и я не менял его. Он отлично растягивается, когда текстовые поля становятся больше, но не, когда они становятся меньше. Почему я не должен позволять текстовым полям растягиваться в зависимости от содержащейся строки? И я добавил XAML для UserControl. На самом деле ничего особенного. - person Aaginor; 22.06.2010
comment
Из приведенного выше кода: как узнать, что панель стека не сжимается? - person VoodooChild; 22.06.2010