2010-05-10 4 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 너비를 TextBox의 ActualWidth에 바인딩함으로써 원하는 것을 얻을 수있었습니다. 다음 코드는 윈도우의 그리드를위한이다 : 도움이

<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

오래된 질문, 그래서 아마 더 이상 영업 이익을 도움이되지 않습니다, 그러나 다른 사람을 도울 수 있습니다 : 캔버스 내부에 UserControl1을 넣어

. 그런 다음 너비를 부모 Grid의 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 내부의 컨트롤은 Canvas에서 크기를 가지지 않으므로 수동으로 크기를 지정해야합니다. 이 경우 부모 Grid의 크기를 지정하고자합니다.

관련 문제