Как изменить размер элементов управления в WPF, эквивалентный свойствам привязки / закрепления Windows Form?

#wpf #autoresize

#wpf #авторазмер

Вопрос:

Я прочитал так много решений этой проблемы. Каждый из них не решает мою проблему. Независимо от того, в какой контейнер я помещаю элемент управления или какие свойства я устанавливаю для элемента управления / контейнера, он не сдвинется с места. У меня есть средство просмотра прокрутки с элементом управления внутри. Я хочу, чтобы он изменялся вместе с окном, когда пользователь изменяет его размер во время выполнения. Все, что мне нужно, это anchor=top, bottom, left, right . Я не понимаю, почему это так сложно в WPF и почему для выполнения того, что может одно свойство в Windows Forms, должны быть задействованы объекты контейнера и все виды назначений свойств. Но каждое решение этой проблемы по-прежнему приводит к тому, что мой элемент управления остается точно таким, какой был во время разработки, поскольку размер окна изменяется во время выполнения. Какой самый простой способ получить доступ к динамическому изменению размера элемента управления в WPF?

Комментарии:

1. Не могли бы вы показать нам XAML-код, который у вас есть прямо сейчас?

2. Вы можете попробовать width / height = «*» и / или использовать stackpanel

Ответ №1:

Это тоже огорчило меня, и AlexK помог мне увидеть свет. Хитрость заключается не в том, чтобы задавать высоту и ширину…. Установите для них значение AUTO и используйте MARGIN для задания размера. Установите HORIZONTALALIGNMENT и VERTICALALIGNMENT на STRETCH , и тогда функция привязки заработает.

Ответ №2:

Элемент управления должен растягиваться, это все, что должно быть:

 <MyControl HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
  

Stretch заменяет установку привязок к обеим соответствующим сторонам.

Для получения справки по панелям смотрите этот обзор. Также смотрите документацию системы компоновки.

Большинство элементов управления автоматически растягиваются, если у вас есть DataGrid, он тоже должен растягиваться, этот пример содержит DataGrid и TextBlock, который показывает его размер:

 <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <DataGrid Name="grid">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Name}" Header="Name"/>
                <DataGridTextColumn Binding="{Binding Tag}" Header="Occupation"/>
            </DataGrid.Columns>
            <FrameworkElement Name="Skeet" Tag="Programmer"/>
            <FrameworkElement Name="Gravell" Tag="Programmer"/>
            <FrameworkElement Name="Steve" Tag="Coffee Getter"/>
        </DataGrid>
        <TextBlock Grid.Row="1">
            <TextBlock.Text>
                <MultiBinding StringFormat="{}{0}, {1}">
                    <Binding ElementName="grid" Path="ActualWidth"/>
                    <Binding ElementName="grid" Path="ActualHeight"/>
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>
    </Grid>
</Window>
  

При уменьшении размера окна должны появиться полосы прокрутки сетки данных.

Комментарии:

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

2. Панель, на которой находится элемент управления, должна иметь границы, иначе она не сможет растягиваться, scrollviewer этого не делает, поскольку вся его цель — сделать возможным просмотр элементов управления любого размера, обычно они не ограничивают их содержимое. Редактировать: На самом деле это работает и с ScrollViewer, в некоторых случаях это зависит от элемента управления. Какой элемент управления вы используете в любом случае?

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

4. DataGrids имеют свой собственный ScrollViewer.

Ответ №3:

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

  • Используйте DockPanel в качестве контейнера.
  • Удалите явные свойства ширины и высоты из вашего элемента управления.

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

Выражения Blend и, начиная с VS2010, оба учитывают пространство имен designer, поэтому вы можете указать размер элемента управления только во время разработки.

Для этого добавьте в свой элемент управления следующее:

 <UserControl ...
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    mc:Ignorable="d"
    d:DesignWidth="WWW" d:DesignHeight="HHH">
    ....
</UserControl>
  

d: DesignWidth и d:DesignHeight задают ширину и высоту времени разработки.

Комментарии:

1. Я попытался поместить это на панель dock. мне кажется, что элемент управления будет расширяться, чтобы заполнить панель dock, но сама dockpanel останется того же размера, независимо от того, насколько большим становится окно.

2. Я проголосовал против этого случайно. В то время я даже не осознавал, что сделал это. Я хотел бы отменить это, но это не позволит мне изменить свой голос, если ответ не отредактирован.

Ответ №4:

Этот вопрос старый, но, поскольку я нашел свой здесь, я подумал, что я бы выбросил свое решение. Приведенный ниже код предназначен для элемента управления tab с двумя вкладками, и каждая вкладка содержит элемент управления для заполнения вкладки. Я удалил явно установленные ширину и высоту и установил автоматическое выравнивание по горизонтали и вертикали для всех элементов управления, размер которых я хотел изменить. Элемент управления tab растягивается до главного окна. Элементы управления на вкладках растягиваются, заполняя вкладки. Информация взята из ответов здесь. Я только что привел полный пример.

Надеюсь, это кому-то пригодится.

         <TabControl HorizontalAlignment="Stretch" 
                Margin="91,0,0,0" Name="tabControl1"
                VerticalAlignment="Stretch" >
        <TabItem Header="DataGrid" Name="tabItem1">
            <Grid>
                <DataGrid AutoGenerateColumns="False" 
                          HorizontalAlignment="Stretch" 
                          Name="dgFTPLog"
                          VerticalAlignment="Stretch" 
                          Margin="6,6,0,0" />
            </Grid>
        </TabItem>
        <TabItem Header="Log" Name="tabItem2">
            <Grid>
                <TextBox 
                         HorizontalAlignment="Stretch" 
                         Margin="6,6,0,0" Name="txtLog"
                         VerticalAlignment="Stretch"
                         VerticalScrollBarVisibility="Auto" 
                         HorizontalScrollBarVisibility="Auto" 
                         TextChanged="txtLog_TextChanged" />
            </Grid>
        </TabItem>
    </TabControl>
  

Ответ №5:

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

т. е. XAML

 <MyParentControl x:name="parentControl" SizeChanged="parentControl_SizeChanged">
     <ChildControl x:name=childControl" />
</MyParentControl>
  

в .cs коде, лежащем в основе

 private void parentControl_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        childControl.Height = parentControl.ActualHeight;
        childControl.Width = parentControl.ActualWidth;
    }