WPF:计算网格列的大小

时间:2018-04-12 08:29:42

标签: wpf wpf-controls

我有一个包含三列的网格。

<Grid Background="AliceBlue">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="8*" />
        <ColumnDefinition Width="5" />
        <ColumnDefinition Width="2*" Name="ManualControlsSplit" />
    </Grid.ColumnDefinitions>

第一列包含网格和图表。

第二列包含GridSplitter。

第三列包含一个StackPanel,它包含许多包含TextBlocks和Buttons的TextBlocks,Buttons和Grids。文字大小是动态的,并且基于翻译资源。

我需要计算第三列内容理想情况下可以绘制的最小宽度,以便不会剪切内容。

我对WPF的了解仅限于我可以谷歌,所以任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

使用WPF中的布局,您可以允许Grid.Columns中的一个<ColumnDefinition Width="Auto"/>Auto。这基本上告诉WPF允许所包含的控件所需的空间。也可以使用StackPanel级联,因此在您引用的Auto中,您也可以使用它包含的项目来控制宽度TextBlock;如果堆栈面板仅包含Auto(通过某些模板或其他),那么您还可以根据包含的文本将此宽度设置为<Grid Background="AliceBlue"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="5"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> ... <StackPanel Grid.Column=2 Width="Auto"> <TextBlock Width="Auto" Text="This is TextBlock"/> ... </StackPanel> ... </Grid> ,并将宽度设置为自身。

Text

在这种情况下,TextBlock的{​​{1}}设置StackPanel的宽度,后者又设置第3个网格列的宽度。

我希望这会有所帮助。

答案 1 :(得分:0)

我的WPF XAML设置如下(删除位以保持这一点):

<UserControl ....>
  <Grid Background="AliceBlue" Name="TopGrid">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="12*" Name="Graph" />
        <ColumnDefinition Width="5" Name="GridSplitter" />
        <ColumnDefinition Width="2*" Name="ManualControlsSplit" />
    </Grid.ColumnDefinitions>

    <Grid Grid.Column="0" Background="AliceBlue"
          HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
    <!-- A Graph and simple controls -->
    </Grid>

    <!--  GRID SPLITTER  -->
    <GridSplitter Grid.Column="1" Width="5"
          HorizontalAlignment="Stretch" Name="Splitter" />
    <Label Grid.Column="1" Content="⁞" Foreground="White" 
          Background="DarkGray"
          VerticalAlignment="Center" FontSize="26" FontWeight="Bold" 
          IsHitTestVisible="False"/>
    <!-- end GRID SPLITTER -->

    <StackPanel Grid.Column="2" Grid.Row="0" Margin="5"
          Name="TemperatureControls">
    <!-- Load of Controls -->
    </StackPanel>
  </Grid>
</UserControl>

要计算所需的宽度,请使用以下代码:

// get my UserControl object
var manualControlView = userControl as HeatingController.Views.ManualControlView;

// Query the current width of THIRD column
double actualWidth = manualControlView.ManualControlsSplit.ActualWidth;

// Set up a BIG size (this has to be bigger size than the contents of the
// THIRD column would ever need)
Size size = new Size(400, manualControlView.TopGrid.ActualHeight);

// Ask WPF layout to calculate the Desired size.
manualControlView.TemperatureControls.Measure(size);

double width = manualControlView.TemperatureControls.DesiredSize.Width;
if (actualWidth <= width)
{
   // Too small - do something
}
else
{
   // big enough - do something else.
}

变量'width'现在包含我想要计算的值。