как изменить размер элементов управления в wpf, равнозначно свойствам привязки / закрепления - PullRequest
28 голосов
/ 11 мая 2011

Я прочитал так много решений этой проблемы.каждый из них не может решить мою проблему.независимо от того, в какой контейнер я поместил элемент управления или какие свойства я установил для элемента управления / контейнера, он не будет сдвигаться с места.У меня есть просмотрщик прокрутки с элементом управления внутри.Я хочу изменить размер окна, когда пользователь изменяет размер во время выполнения.все, что мне нужно, это якорь = сверху, снизу, слева, справа.Я не понимаю, почему это так неуловимо в WPF и почему необходимо задействовать объекты-контейнеры и все виды назначений свойств, чтобы выполнить то, что может одно свойство в формах.но каждое решение этой проблемы по-прежнему приводит к тому, что мой элемент управления остается с точным размером времени разработки, поскольку размер окна изменяется во время выполнения.Каков простой способ получить размеры динамического управления в wpf?

Ответы [ 5 ]

45 голосов
/ 09 октября 2011

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

5 голосов
/ 11 мая 2011

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

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

Stretch заменяет установочные ахоры с обеих сторон.

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

Большинство элементов управления автоматически растягиваются, если у вас есть DataGrid, он тоже должен растягиваться, попробуйте этот пример в Kaxaml , он содержит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>

Если вы уменьшите размер окна вниз, должны появиться ScrollBars DataGrid.

4 голосов
/ 11 мая 2011

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

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

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

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

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

<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 голос
/ 21 сентября 2011

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

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

        <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>
0 голосов
/ 11 февраля 2016

Я тоже сталкивался с этими проблемами. и Попытка связывания с родительскими элементами управления свойствами 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...