我有一个包含三列的网格。
<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的了解仅限于我可以谷歌,所以任何帮助将不胜感激。
答案 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'现在包含我想要计算的值。