2010-05-10 8 views
1

Не могу понять, как правильно управлять шириной столбца сетки с помощью пользовательского элемента управления в одной из его ячеек. У меня есть этот 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, а не ширина столбца.

ответ

7

Я смог добиться того, что (я считаю), которое вы ищете, указав 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> 

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

+0

Это очень помогает, спасибо, и я поставил под вопрос вопрос. В реальном контексте я не могу использовать текстовое поле (или оно должно быть скрытым, но мне не хочется этого делать), и поскольку столбец будет содержать несколько элементов управления, я не смогу привязываться к нему в частности. Я прочитал другие темы о привязке к gid ColumnDefinition, но это не удалось, поэтому я все еще ищу эту возможность. – 742

2

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

Поместите UserControl1 внутри Canvas. Затем привяжите Width к ActualWidth родительской сетки.

Пример:

<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> 

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

Смежные вопросы