Запретить элемент управления в сетке, чтобы изменить ширину его столбца - PullRequest
1 голос
/ 10 мая 2010

Я не могу понять, как правильно управлять шириной столбца сетки с помощью пользовательского элемента управления в одной из его ячеек. У меня есть этот xaml для окна:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto" />
        <RowDefinition Height="auto" />
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="auto" />
    </Grid.ColumnDefinitions>        
    <Button Grid.Row="0" Content="Button" Width="100" HorizontalAlignment="Left"/>
    <TextBox Grid.Row="1" />
    <local:UserControl1 Grid.Row="2"
                        HorizontalAlignment="Left" VerticalAlignment="Top"/>
</Grid>

, а пользовательский элемент управления - это набор чертежей для растягивания по мере необходимости:

<UserControl x:Class="WpfApplication1.UserControl1"
             Height="auto" Width="auto">

    <Grid Background="Aqua">
        <Path Fill="Coral" Stroke="Black" StrokeThickness="1"
              Stretch="Uniform"
              HorizontalAlignment="Left" VerticalAlignment="Top">
            <Path.Data>
                <RectangleGeometry Rect="40,20, 140,30" RadiusX="10" RadiusY="10" />
            </Path.Data>
        </Path>
    </Grid>
</UserControl>

Чтобы помочь, я установил фон управления пользователем синим цветом.

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

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

Я пробовал комбинации значений растяжения, а также использовал MeasureOverride () в пользовательском элементе управления. Последний не работает, потому что полученный AvalaibleSize равен Infinity, а не ширине столбца.

Ответы [ 2 ]

7 голосов
/ 10 мая 2010

Мне удалось добиться того, что (я считаю) вы ищете, дав имя TextBox и привязав ширину UserControl к ActualWidth TextBox. Вот код для сетки окна:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto" />
        <RowDefinition Height="auto" />
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="auto" />
    </Grid.ColumnDefinitions>
    <Button Grid.Row="0" Content="Button" Width="100" HorizontalAlignment="Left"/>
    <TextBox Grid.Row="1" x:Name="entryTextBox" />
    <local:UserControl1 Grid.Row="2"
                        Width="{Binding ElementName=entryTextBox, Path=ActualWidth}"
                        HorizontalAlignment="Left" VerticalAlignment="Top"/>
</Grid>

Надеюсь, это поможет!

3 голосов
/ 19 мая 2017

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

Поместите UserControl1 в Canvas. Затем свяжите ширину с фактической шириной родительской сетки.

Пример:

<Grid Name="mainGrid">
          <Grid.RowDefinitions>
                <RowDefinition Height="Auto"></RowDefinition>
                <RowDefinition Height="Auto"></RowDefinition>
          </Grid.RowDefinitions>
          <Something Grid.Row="0"/>
          <Canvas Grid.Row="1">
                <MyControl Width="{Binding ActualWidth, ElementName=mainGrid, Mode=OneWay}"/>
          </Canvas>
</Grid>

Холст займет доступную ширину, но никогда не будет запрашивать у Grid больше. Элементы управления внутри холста не получают размер из Canvas, поэтому вы должны указать его вручную. В этом случае мы хотим дать ему размер родительской сетки.

...