我有以下XAML代码:
<Grid Grid.Row="2" Name="grid_StatusBar">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="{Binding ElementName=wrapPanel, Path=ActualWidth}" />
<ColumnDefinition Width="30" />
</Grid.ColumnDefinitions>
<ProgressBar Grid.Column="0" HorizontalAlignment="Stretch" Margin="5,5,5,5" Name="progressBar1" VerticalAlignment="Stretch" />
<WrapPanel Grid.Column="1" Name="wrapPanel" HorizontalAlignment="Right">
<Label Content="1" Height="28" HorizontalAlignment="Right" Margin="0,0,0,0" Name="label_Dataset" VerticalAlignment="Stretch" Visibility="Collapsed" />
<Label Content="/20" Height="28" HorizontalAlignment="Right" Margin="0,0,0,0" Name="label_TotalDatasets" VerticalAlignment="Stretch" Visibility="Collapsed" />
<Label Content="ID:" Height="28" HorizontalAlignment="Right" Margin="0,0,0,0" Name="label_IDText" VerticalAlignment="Stretch" />
<Label Content="no id" Height="28" HorizontalAlignment="Right" Margin="0,0,0,0" Name="labelID" VerticalAlignment="Stretch" />
</WrapPanel>
<Button Grid.Column="2" Name="button_Help" Height="30" Width="30" Content="?" HorizontalAlignment="Right" VerticalAlignment="Stretch" Click="button_Help_Click" >
</Grid>
我想在更改某些标签的可见性和设置不同的文本(以及不同的长度/宽度)时尽可能地展示进度条。
我有不同的功能:
labelID
标签的“无ID”文本将替换为内部值。 宽度已更新:确定 ColumnDefinition.Width
没有更新,只显示了前两个标签(因为没有足够的地方可以让所有4个标签都适合在wrapPanel ActualWidth中:错误! Visibility
属性从前两个标签从Collapsed
更改为Visible
,则从一开始所有标签的可见性均为Visible
,并且所有标签显示:确定 Collapsed
,ColumnDefinition.Width
更新,ProgressBar
尽可能宽,并显示所有文字:确定 有人可以帮帮我吗?我不明白为什么宽度没有更新...
注意:使用运行以下代码的窗口中的两个按钮更改可见性:
label_Dataset.Visibility = System.Windows.Visibility.Visible;
label_TotalDatasets.Visibility = System.Windows.Visibility.Visible;
编辑:我的目标是使用最小空格(在一行中)显示可见标签,以便使用最大宽度使ProgressBar。
答案 0 :(得分:1)
无法根据子项的宽度更改父元素的宽度。在您的情况下,该列是WrapPanel
的父级,因此ActualWidth
的{{1}}在网格/列已经调整后才可用。
即使您编写了代码来尝试和规避这一点,您仍然会遇到问题,因为度量/布局序列将变得可重入。只要列的大小发生更改,它就会重新布局所有子控件,其中一个是WrapPanel
。这将导致WrapPanel
的{{1}}被更改 - 有效地导致无限循环。为了防止这种堆栈溢出情况,框架会立即检测布局/度量周期中的任何重入并引发异常。
我不确定你想要实现的目标。为什么要在ActualWidth
中添加标签?当然,你总是希望4个标签在同一条线上,或者至少在两条线上。
如果是这种情况,我会将第二列的宽度设置为“自动”并将标签放在另一个容器中,即下列之一:
如果您希望包装所有标签,例如WrapPanel
被强制为最小宽度,请使用:
WrapPanel
如果您希望所有标签保持在同一条线上,请使用:
WrapPanel
如果您想使用两行:
<StackPanel Grid.Column="1" Orientation="Vertical">
... your labels here ...
</StackPanel>