簡體   English   中英

WPF大小調整網格。到內容

[英]WPF Sizing Grid.Row to content

我有一個使用SizeToContent="WidthAndHeight"的窗口,並且有一列包含三行。 行的定義如下:

<Grid.RowDefinitions>
    <RowDefinition />
    <RowDefinition />
    <RowDefinition />
</Grid.RowDefinitions>

內容由上一行每一格組成。 這些面板中的每個面板都包含一個標簽和一個ListBox。 ListBox動態添加或刪除其內容。 因此,它可能只有一項,或者可能有100項。

我的問題是:當我的應用程序啟動時,上面提到的三行將根據其中的內容進行大小調整。 所以看起來很整潔。 如果第一行在ListBox中僅包含一個項目,則將其大小調整為恰好適合這些項目。 如果用戶希望看到每一行中的溢出內容,另外兩行(如果內容已滿)將把其余空間分成兩半,並使它們的滾動條可見。 但是,一旦我調整了主窗口的大小,無論其中的內容量如何,三行都將立即自動調整大小,使每一行的高度完全相同。

我嘗試在外部網格的行定義中使用Height="Auto" 但是,這會調整每一行的大小以精確地適合內容,從而導致它們從屏幕上溢出,而無需啟用滾動條。

我嘗試了所有我知道的(key:知道)的設置,但無法解決。 現在,我擺脫了SizeToContent這樣就不會發生奇怪的錯誤了,但是無論行中的內容有多少,行的大小都是成比例的……我也希望這樣做。 我不希望每行的高度都是靜態的,而是希望它們在不離開屏幕的情況下根據其中的內容量來動態調整自身大小。

有沒有辦法解決這個問題?

在XAML中,您可以綁定到ViewModel中的屬性

<Grid.RowDefinitions>
    <RowDefinition Height="{Binding Row1Height}"/>
    <RowDefinition Height="{Binding Row2Height}"/>
    <RowDefinition Height="{Binding Row3Height}"/>
</Grid.RowDefinitions>

然后在您的ViewModel中

public int Row1Height { get; set; }
public int Row2Height { get; set; }
public int Row3Height { get; set; }

並且一旦有了內容,就進行一些計算以填充該值。

為了正確處理,您必須制作自己的自定義Panel ,該Panel比標准Grid更智能地處理尺寸分布。 這個項目可能是一個很好的起點: ConstrainingStackPanel

假設我正確理解了您的問題,您是否嘗試過將其包裝在ScrollViewer中並關閉ListView的滾動條?

我發現WPF中的布局渲染既可以發揮積極作用,也可以發揮作用。 在內容大小調整方面,有時要使它正常工作會很麻煩。

如果您不希望使用ScrollViewer的方法,則可以通過編寫某種附加的行為來輕松完成類似的事情(我過去已經這樣做過),但是在這種情況下,這太過分了。

ScrollViewer方法的示例:

<Grid>
  <ScrollViewer>
        <ListView ItemsSource="{Binding Something}" ScrollViewer.VerticalScrollBarVisibility="Hidden">
  :
  :
  :
  </ScrollViewer>
</Grid>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM