2

以下のコードは、問題の完全な表現です。基本的に、ScrollViewer 内に ListBox がある場合、ListBox は独自のスクロールバーを表示しません。むしろ、親 ScrollViewer のスクロールバーに依存します。私の状況では、MinHeight/MinWidth に違反したときにスクロールバーが表示されるように、コントロール全体を ScrollViewer にラップしています。ListBox は、UserControl 内の多数のコントロールの 1 つにすぎず、ListBox 内の項目と一致するように UserControl を広い比率にジャンプさせたくありません。ListBox に独自のスクロールバーを強制的に使用させるには、以下のコードに何を追加しますか?

using System;
using System.Windows;
using System.Windows.Controls;

namespace TestExpanderWidth
{
    class Program
    {
        [STAThread]
        static void Main()
        {
            var listbox = new ListBox { Margin = new Thickness(10.0), MinWidth = 400 };
            listbox.Items.Add(new string('c', 3000));

            var sv = new ScrollViewer {HorizontalScrollBarVisibility = ScrollBarVisibility.Auto, VerticalScrollBarVisibility = ScrollBarVisibility.Auto};
            sv.Content = listbox; // remove for test

            var window = new Window { Width = 600, Height = 400 };
            window.Content = sv; // remove for test
            //window.Content = listbox; // add for test

            var application = new Application();
            application.Run(window);
        }
    }
}
4

3 に答える 3

5

レイアウトダイアログ

ScrollViewerto ListBox:スペースはいくらでもいいのですが、いくらですか?
ListBoxto ScrollViewer: 正確には、すべてのアイテムを表示する必要があるだけ<X, Y>です。
ScrollViewerto ListBox: はい、これを取って<X, Y>ください。
ListBoxto ScrollViewer: K thx, i will expand to <X, Y>(今はスクロールバーは必要ありません)。

サイズを制限した場合にのみListBoxを使用できますが、これは に配置して配置を に設定した場合には発生しません。ScrollViewerScrollViewerStretch

于 2012-08-13T04:13:01.927 に答える
2

これがこれを行うための最良の方法かどうかはわかりませんが、すべての強烈な目的のために、あなたが要求した機能を提供しているようです.

public MainWindow()
    {

        InitializeComponent();

    }

    public void WindowLoaded(object sender, EventArgs e) 
    {
        listbox = new ListBox { Margin = new Thickness(10.0), MinWidth = 400, MinHeight = 400 };
        listbox.Items.Add(new string('c', 3000));

        var sv = new ScrollViewer { HorizontalScrollBarVisibility = ScrollBarVisibility.Auto, VerticalScrollBarVisibility = ScrollBarVisibility.Auto };
        sv.Content = listbox; // remove for test

        this.Width = 600;
        this.Height = 400;
        this.Content = sv;

    }

    protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
    {

        base.OnRenderSizeChanged(sizeInfo);
        if (listbox != null)
            listbox.MaxWidth = this.RenderSize.Width - (int.Parse(listbox.Margin.Right.ToString()) * 4);

    }

基本的に、ListBox に Window の Render Width に基づく MaxWidth を割り当て、イベントをトリガーするために OnRenderSizeChanged イベント ハンドラーをオーバーライドしました。

これがあなたを助け、あなたが望むように機能することを願っています!

于 2012-08-14T09:56:44.070 に答える
0

私は自分でWPFを学んでいますが、これまでのところ、ListBoxにはScrollBarがないことを理解しています。そのコントロールにScrollBarsを与えたい場合は、それをScrollViewerでラップする必要があります。したがって、あなたの場合、私が正しく理解していれば、ListBoxのみをラップする2番目のScrollViewerを追加する必要があります。

于 2012-08-07T18:01:27.407 に答える