WPFから追加の垂直空白を削除します

c# wpf xaml
WPFから追加の垂直空白を削除します

コードビハインド:

//this is a little unweidly, but its test code until this works
MobileWPF.singleton.EventDetailsTabControl.myEventDetailControl.personListBoxTest.ItemsSource =
    dc.SessionEvent.SessionPersons.ToList();

以下は6項目の結果のイメージです。すべてのデータはナンセンスなテストデータです。

image:https://i.stack.imgur.com/UfZDN.jpg [screenshot]

編集2:

少し遊んだ後、これが起こっていると思います…​ 最初に、ListBoxは貪欲であり、垂直方向のスペースを最大限に使用します。次に、IValueConverterの計算がいくつか行われ、一部の要素が折りたたまれます。 ただし、これが完了すると、ListBoxの高さは更新されません。

編集3:

PersonListBoxTestをListBoxではなくItemsControlに変換しようとしましたが、コードと「宣言」の違いのみがあります…​ そして今、それは期待どおりに動作し、余分な空白はありません。

そのため、ItemsControlは、一部の要素がIValueConvertersを介して折りたたまれているという事実を尊重していますが、ListBoxはそうではありません。 ItemsControlをテストする前に、ListBoxのVirtualizingStackPanel属性をいじって、IsVirtualizingをtrueとfalse(変更なし)の両方に設定しました。

私がそれを観察した方法でそれがなぜ機能するのかを説明できる人にポイントを与えます。 +皆さんの回答をありがとう、あなたは何が違いを生むのか決してわかりません。

使用されているIValueConverterの例を次に示します。これらはほぼ同じです。

[ValueConversion(typeof(object), typeof(System.Windows.Visibility))]
public class NullToVisibleOrCollapsed : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null) return System.Windows.Visibility.Collapsed;

        if (value is Image)
        {
            if (((Image)value).Source == null) return System.Windows.Visibility.Collapsed;
            return System.Windows.Visibility.Visible;
        }

        if (value is string)
        {
            string myString = (string)value;
            if (string.IsNullOrEmpty(myString) == true)
                return System.Windows.Visibility.Collapsed;
        }

        if (value is int)
        {
            int myInt = (int)value;
            if (myInt == 0)
                return System.Windows.Visibility.Collapsed;
        }

        return System.Windows.Visibility.Visible;
    }

  2  0


ベストアンサー

これが発生する理由は、ListBoxがデフォルトの ItemsPanelTemplate`設定をオーバーライドして VirtualizingStackPanel`を使用するためです。 これは、VirtualizingStackPanelがUI仮想化をサポートするためです。つまり、目に見えるコントロールのみが評価および作成され、大量のデータセットのパフォーマンスを向上させることができます。

UIの仮想化中に、コントロールは子要素の可視性を確認し、子要素とその子要素を測定します。 この評価順序は、余分なスペースが表示される主な理由です。 子要素のバインドされた値を使用して、親要素の可視性を設定しています。

フレームワークがStackPanelを評価するとき、Visibilityはまだ設定されていないため、デフォルトでVisibleになります。 代わりに子プロパティと同じバインディングパスを使用するようにVisibilityバインディングを変更した場合、これを修正できます。

また、 Collapsed`の FallbackValue`を指定することもできます。これは、バインディングを解決できない場合にVisibility.Collapsedを使用するようにエンジンに指示します。 ただし、これによりUIの測定値が台無しになり、他の望ましくない効果が生じる可能性があるため、注意が必要です。

最後に、通常のItemsControlテンプレートはUI仮想化をサポートしないため、事前に測定する必要はありません。 つまり、コントロールが生成されてから非表示になり、それに応じてサイズが調整されます。

2


デフォルトでは、コントロールはコンテナが提供するすべてのスペースを埋めるように拡張されます。 それはあなたが見ているものであり、他に何もするように言わなかったので期待されています(つまり、ListBoxで配置プロパティを設定していません)。

ListBoxがアイテムを表示するために必要なだけの高さを取得するようにしたい場合は、 VerticalAlignment`プロパティをデフォルト値の Stretch`以外に設定します。 例えば:

または、必要に応じて、「Bottom」または「Center」を使用することもできます。レイアウトに最も適したものであれば何でもかまいません。

`Top`を使用すると仮定すると、リストボックスにListBoxの親によって指定されたスペースの半分を埋めるだけのアイテムがある場合、ListBox全体がそのスペースを占有し、残りの親は空になります。 ただし、リストボックスアイテムが非常に多く(または親が非常に小さく)なり、すべてのアイテムが収まらない場合、リストボックスはすべてのスペースを埋め、スクロールバーを表示します。

1


ListBox`を Grid`でラップし、 `VerticalAlignment =” Top “`に設定します

ListBox`コントロールは、 Grid`や `DockPanel`などの別の要素の中にあるように聞こえます。これらの要素は、デフォルトで子を引き伸ばして使用可能なすべてのスペースを埋めます。

0


あなたの質問を正しく理解していれば、リストボックス(または他のコントロール)に `Height =” Auto “`を使用でき、リストボックスに従ってウィンドウの高さを更新したい場合は、ウィンドウの高さをリストボックスにバインドできます。以下のコード:

Height="{Binding ActualHeight, ElementName=personListBoxTest}"

あなたの役に立つことを願っています。

0


多分…

0


高さをAUTOにするには、ListBoxを含むコンテナを作成する必要があります

ListBox1は高さAUTOの行にあります

ListBox2は高さの行スパンにあります*

これにより、コンテナ内の値のサイズとして、それを保持しているコンテナの最大の高さまで、リストボックスに正しい高さを持たせることができます…​ ちょっと混乱しますが、それが理にかなっていることを願っています。

それが役立つことを願っています!

このサンプルコードをご覧ください

        I'm an item in listbox1
        I'm an item in listbox1
        I'm an item in listbox1
        I'm an item in listbox1
        I'm an item in listbox1
        I'm an item in listbox1



        I'm an item in listbox2
        I'm an item in listbox2
        I'm an item in listbox2
        I'm an item in listbox2
        I'm an item in listbox2
        I'm an item in listbox2
        I'm an item in listbox2

0


タイトルとURLをコピーしました