2017-10-04 3 views
0

現在、Column/Rowスパンで事前に計算されたItemの高さと幅の代わりに、VariableGridViewと同様に機能するコントロールを作成しようとしています。 。コントロールの幅を決定する列スパンで。あなたはWIPサンプルhereを見つけることができます。UWPカスタムパネルは、Panel Childrens配置高さに基づいてサイズが変更されました

私が現在持っている唯一の問題は、コントロールの初期ロードです。コントロールがScrollViewer内にあり、その高さがウィンドウ/親の高さを超えると、スクロールしません。以下を参照してください:

Scrollbar fills the right hand side

私はウィンドウのサイズを変更したら、予想通りただし、スクロールが正常に動作します。以下を参照してください:

You can see here the scrollbar has fixed itself and is the right size for the content of the Panel

見えにくいかもしれませんが、あなたは右側のスクロールバーの暗い部分を見れば、あなたはそれが最初のロード時に正しく自分自身をサイズのいない見ることができます。

protected override Size MeasureOverride(Size availableSize) { 
    // Need to use this method LimitUnboundedSize as when within a 
    // ScrollViewer an infinite height is supplied within the availableSize 
    var desiredSize = LimitUnboundedSize(availableSize); 
    UpdateColumnOffsets(); 
    foreach (var child in Children) { 
    child.Measure(desiredSize); 
    } 
    return desiredSize; 
} 

private Size LimitUnboundedSize(Size input) { 
    if (Double.IsInfinity(input.Height)) { 
    var scrollViewer = this.FindAscendant<ScrollViewer>(); 
    var contentHeight = scrollViewer.ViewportHeight.Equals(0) 
     ? Window.Current.Bounds.Height : scrollViewer.ViewportHeight; 
    input.Height = (contentHeight >= GetMaxOffset ? contentHeight : 
     GetMaxOffset); 
    } 
    return input; 
} 

を、私は私の項目を取るしようとしている高さを計算するにはどうすればよい:

は私がMeasureOverride方法は、しかし、私は私が間違ってやっているかを見ることができないコントロールでミスを作ってるんだ疑い私のコントロールのサイズを設定する前に?

+0

あなたのアプリをダウンロードした後、私は違いを見ることができます。この問題は、UIのサイズを変更した後で、初期化時に何かを設定し、GetMaxOffsetが常にcontentheightよりも高くなっているために発生します。初期化するときGetMaxOffsetは10ですが、それ以降は元に戻りません。なぜ高さをInfinityにしないのですか? –

+0

残念ながら私は高さを無限にすることはできません。無限であればクラッシュします。 [ここ](https://docs.microsoft.com/en-us/windows/uwp/layout/boxpanel-example-custom-panel)から引用 - 「パネル自体は無限のサイズを返すことはできませんMeasureOverrideからの値で、レイアウト中に例外がスローされます。 – jsmyth886

答えて

0

私自身の問題を解決することができました。私は手配の前に私のカードの配置を把握する必要があった。このようにして、columnOffsetsが計算され、パネルの高さを最大カラムオフセットから外すことができます。

私はまだgithubのレポを更新していないが、ここではこれが機能するために、更新必要のあるコードです:

protected override Size ArrangeOverride(Size finalSize) { 
    foreach (var child in Children) { 
    var resizable = child as IArrangeable; 
    resizable?.Arrange(pointDictionary.GetValueOrDefault(resizable.Card)); 
    } 
    return finalSize; 
} 

private double GetMaxOffset { 
    get { return columnOffsetY.Max(); } 
} 

protected override Size MeasureOverride(Size availableSize) { 
    var desiredSize = availableSize; 
    UpdateColumnOffsets(); 
    foreach (var child in Children) { 
    child.Measure(desiredSize); 
    CreateOffsetCache(child); 
    } 

    if (Double.IsPositiveInfinity(desiredSize.Height)) 
    desiredSize.Height = GetMaxOffset; 

    return desiredSize; 

} 

private Dictionary<Card, Point> pointDictionary; 

private void CreateOffsetCache(UIElement child) { 
    var arrangeable = child as IArrangeable; 
    if (arrangeable == null) return; 
    var card = arrangeable.Card; 
    var useColumnOffset = columnOffsetY[card.Column] < columnOffsetY[card.Column + card.ColumnSpan - 1] 
    ? columnOffsetY[card.Column + card.ColumnSpan - 1] : columnOffsetY[card.Column]; 
    var point = new Point(columnOffsetX[card.Column], useColumnOffset); 
    pointDictionary[card] = point; 
    SetColumnOffsetY(card.Column, card.ColumnSpan, child.DesiredSize.Height); 
} 
関連する問題