2010-05-10 34 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> 

爲了幫助我已經設置在藍色的用戶控件的背景。

我想列的寬度忽略用戶控件的「自然」大小。我的意思是我希望用戶控件不在列的佈局中確定寬度,而是將其寬度調整爲任何寬度的列。

在這個例子中,最初網格會將列寬設置爲按鈕的值,用戶控件將使用列寬來調整自身的大小。然後,如果在文本框中輸入了長文本,只要文本框開始比按鈕更寬,並且列開始也調整大小,則用戶控件將調整爲保持與列相​​同的大小。

我嘗試過拉伸值的組合,並且還在用戶控件中使用了MeasureOverride()。後者不起作用,因爲收到的AvalaibleSize是無窮大,而不是列寬。

回答

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 2010-05-10 17:51:10

2

老問題,所以它可能會無法幫助OP了,但它可以幫助別人:

放的UserControl1一個Canvas中。然後將Width綁定到父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的大小,所以你必須手動給它一個大小。在這種情況下,我們想給它的父Grid的大小。