Получить ListBox, чтобы изменить размер окна, но не изменить размер содержимого - PullRequest
13 голосов
/ 08 февраля 2012

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

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

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

Ответы [ 5 ]

4 голосов
/ 04 мая 2017

Следуя совету Потекару Тюдора, я решил аналогичную проблему, поместив ListBox в другой контейнер и привязав его значение к 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 ограничена высотой границы.

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

2 голосов
/ 03 сентября 2014

HorizontalAlignment="Stretch" VerticalAlignment="Stretch"

1 голос
/ 20 марта 2013

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

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

0 голосов
/ 24 ноября 2014

Я надеюсь, что у вас есть следующее требование: 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>

C # код:

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));
        }
    }
}
0 голосов
/ 09 февраля 2012

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

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

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

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

...