2009-07-03 79 views
0

我有這樣的情況:如何訪問與高度元素的實際高度=自動

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="560"/> 
     <ColumnDefinition Width="250"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> <!-- status infos & content start --> 
     <RowDefinition Height="Auto" /> <!-- status infos --> 
     <RowDefinition Height="Auto" /> <!-- status infos --> 
     <RowDefinition Height="Auto" /> <!-- status infos --> 
     <RowDefinition Height="*"/>  <!-- content ends --> 
    </Grid.RowDefinitions> 

    <!-- image a list of custom controls directed to the first or second column on all rows here --> 

    <SomeCustomControl Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Grid.RowSpan="2" /> 
</Grid> 

正如你可以看到我有2列,右邊一個是狀態信息或多或少的保留,該留下內容。 「SomeCustomControl」包含一個如此寬的控件,需要將其設置爲ColumnSpan =「2」。請注意,右列中仍然有狀態控制。在SomeCustomControl我有這樣的事情:現在

<Grid x:Name="LayoutRoot"> 

    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="250"/> 
    </Grid.ColumnDefinitions> 

    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     [...] 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*" /> <!-- problem control here --> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 

    <!-- a list of Controls limited to the first column --> 

    <ProblemControl Grid.Column="0" Grid.ColumnSpan="2" /> 
</Grid> 

,SomeCustomControl的第一行包含限於第一列控制,再有就是包含我ProblemControl一行。狀態控件的高度不是預先確定的,取決於顯示的狀態信息。 SomeCustomControl中限於第一列的控件也有不同的高度,目前通過內容自動確定。

我現在有ProblemControl與我的一些狀態控件重疊的問題。我試圖計算我的狀態控件的高度以及SomeCustomControl中的有限控件的高度,但是由於所有控件都是動態調整大小的,我似乎無法得到正確的高度。 RowDefinitions的高度都包含類型爲Auto的值和值爲1的高度,具體控件的高度似乎爲NaN。

任何想法如何我可以計算高度或防止其他方式的重疊。

回答

1

您是否嘗試過使用ActualHeight屬性進行控制?

+0

由於控件只是可見的,所以這個值似乎包含「舊」值(0表示元素只是可見的,一些值取決於現在改變的狀態信息)。 嗯,也許我可以找到一些事件,把計算在控制可見後觸發。 Thx爲ActualHeight無論如何。我猜想爲什麼我不需要新眼鏡的原因搜索時間已經結束了:P – gsnerf 2009-07-03 14:45:27

0

您應該可以通過正確使用Grid來解決此問題,並且一些面板(DockPanelStackPanel可能非常有用)。在某些控件上,您可能還需要將HorizontalAlignmentVerticalAlignment屬性設置爲Stretch

您的示例沒有足夠的內容讓我們重複您的問題或知道我們已正確解決它。如果您需要更具體的幫助,請展開示例,以便我們運行它並查看您的問題。

+0

請注意,我在這裏嵌套控件,第二個網格在我在第一個網格中引用的控件內部。我不能把這個網格一步一步地解決,只是用網格和麪板來解決它。如果您不想運行該示例,只需創建2個控件,使用給定的網格佈局並放置一些彩色畫布對象。我想我描述了其餘的佈局。 不幸的是,由於項目限制,我無法分享確切的代碼。 – gsnerf 2009-07-03 14:50:17

2

我遇到了一些相同的問題,但最近遇到了解決方案。您無法訪問寬度或高度設置爲「自動」的控件的寬度和高度屬性的原因是,運行系統在設置屬性值之前正在查詢屬性值。屬性ActualWidthActualHeight聲稱從理論上得到控件的渲染高度,所以你會認爲你可以等到SL應用程序完成加載然後執行你的查詢,因爲當時控件將被渲染,因此,應該設置值爲ActualHeight/ActualWidth

不幸的是,情況並非如此。當這些值被設置時,似乎沒有任何保證,所以我使用的解決方法是鉤入我想要的值的控件的事件。如果控件的寬度和高度屬性發生更改,則觸發SizeChanged,因此如果我處理該事件,我保證將值設置爲除NaN以外的其他值。

做任何你需要在該事件處理程序中執行的邏輯,你會發現設置了這些值。