Подтвердить что ты не робот

Получить ListBox для изменения размера с помощью окна, но не изменять размер содержимого

Должно быть элегантное решение этой проблемы, но я ничего не могу найти в Интернете. У меня есть сетка, которая имеет один столбец и строку с шириной/высотой *, содержащую ListBox. У меня есть размер окна WindowToContents, установленный в WidthAndHeight, чтобы разрешить размер окна до нужного размера для каждого набора виджета/шрифтов пользовательского интерфейса. Когда я добавляю элементы в ListBox, он изменяется, заставляя окно расти.

Я хочу, чтобы ListBox изменял размер, если я изменяю размер окна, но если я добавлю контент, который длиннее ширины ListBox, я хочу, чтобы полоса прокрутки появлялась, а не увеличивалась, в результате чего окно расти. Если я устанавливаю явные размеры для окна и устанавливаю SizeToContent в Manual (по умолчанию), он работает так, как я предполагаю.

Есть ли способ изменить размер окна на содержимое при запуске и продолжать увеличивать размер ListBox с размером окна, но не с его содержимым?

4b9b3361

Ответ 1

HorizontalAlignment="Stretch" VerticalAlignment="Stretch"

Ответ 2

Это предполагаемое поведение, связанное с установкой свойства SizeToContent на WidthAndHeight как описанным здесь.

Что вы можете сделать, это привязать ширину и высоту ListBox к свойствам ActualWidth и ActualHeight своего контейнера или использовать конвертер и привязать их непосредственно к соответствующим свойствам окна.

Ответ 3

Следуя предложению Potecaru Tudor, я решил аналогичную проблему, обернув ListBox в другом контейнере и привязывая ListBox Height к ActualHeight контейнера.

Вот фрагмент кода XAML, который поможет:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Border x:Name="HeightHelperPanel" Grid.Row="0">
        <ListBox ItemsSource="{Binding Path=FileNameCollection}"
                 MinHeight="60"
                 Height="{Binding Path=ActualHeight, ElementName=HeightHelperPanel}"/>
    </Border>
</Grid>

В принципе, контейнер Border не растет, когда его контент растет, но он будет оставаться растянутым до высоты строки сетки. Строка сетки заполнит любое пространство, которое будет содержать содержащее окно, но не захочет принудительно устанавливать ограничения по высоте в окне. Поэтому высота ListBox ограничена высотой границы.

Надеюсь, что это поможет любому, у кого была эта несколько неприятная проблема.

Ответ 4

Чтобы изменить размер ListBox при изменении размера окна, используйте:

<ListBox HorizontalAlignment="Stretch" VerticalAlignment="Stretch" .../>

Чтобы включить прокрутку в ListBox, вы можете найти ответ здесь, потому что шаблон по умолчанию для ListBox включает ScrollViewer.

Как получить вертикальную полосу прокрутки в моем ListBox?

Ответ 5

Я надеюсь, что у вас есть нижеследующее требование, 1) ListBox должен использовать полосу прокрутки, размер ее содержимого которой больше, чем ее оригинал.

2) Если размер окна изменяется, ListBox должен увеличиваться и сокращаться вместе с окном.

Я попробовал то же самое с простым примером, пожалуйста, проверьте это, и если он отличается от вашего требования, сообщите мне,

Код XAML:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="30"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <TextBlock Text="I am in Main Grid"/>
        <ListBox Grid.Row="1" BorderBrush="BlueViolet" BorderThickness="5" Margin="10">
            <TextBlock Text="I am a ListBox"/>
            <Button Content="Add Height and Width of ListBox by 100 pixels" Click="Button_Click"/>
            <ListBoxItem Content="ListBoxItem" Background="AliceBlue" Margin="10" BorderBrush="Blue" Width="{Binding ListBoxWidth}" Height="{Binding ListBoxHeight}"/>
        </ListBox>
    </Grid>
</Window>

Код С#:

public partial class MainWindow : Window,INotifyPropertyChanged
{
    private int m_ListBoxWidth = 350;

    public int ListBoxWidth
    {
        get { return m_ListBoxWidth; }
        set 
        {
            m_ListBoxWidth = value;
            OnPropertyChanged("ListBoxWidth");
        }
    }

    private int m_ListBoxHeight = 150;

    public int ListBoxHeight
    {
        get { return m_ListBoxHeight; }
        set 
        {
            m_ListBoxHeight = value; 
            OnPropertyChanged("ListBoxHeight"); 
        }
    }

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        ListBoxWidth += 190;
        ListBoxHeight += 140;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}