2

下面的代码是问题的完整表示。本质上,当我在 ScrollViewer 中有一个 ListBox 时,ListBox 不会显示它自己的滚动条。相反,它依赖于父 ScrollViewer 的滚动条。在我的情况下,我将整个控件包装在 ScrollViewer 中,以便在违反 MinHeight/MinWidth 时获得滚动条。ListBox 只是我的 UserControl 中的众多控件之一,我不希望我的 UserControl 跳到很大的比例以匹配 ListBox 中的项目。你会在下面的代码中添加什么来强制 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,我将扩展到<X, Y>(现在我不需要任何滚动条)。

如果您限制它的大小,您将只能ListBox使用它,如果您将它放在 a中并将对齐设置为 ,则不会发生这种情况。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 分配了一个基于窗口的渲染宽度的 MaxWidth,并且为了触发我已经覆盖 OnRenderSizeChanged 事件处理程序的事件。

希望这可以帮助您并按照您的意愿工作!

于 2012-08-14T09:56:44.070 回答
0

我自己只是在学习 WPF,但到目前为止我的理解是 ListBox 没有 ScrollBars。如果您想赋予该控件 ScrollBars,则需要将其包装在 ScrollViewer 中。所以在你的情况下——如果我理解正确的话——你需要添加第二个只包含 ListBox 的 ScrollViewer。

于 2012-08-07T18:01:27.407 回答