wpf 我怎样才能使这个滚动浏览器在网格单元格中同时水平和垂直工作?

jucafojl  于 2023-01-27  发布在  其他
关注(0)|答案(2)|浏览(200)

我有一个包含一些数据的网格,其中一个单元格包含相当长的字符串(可能有相当多的字符串)。因此,为了不使用太多的可用窗口空间,我希望这些字符串是可滚动的。垂直工作,但无论我尝试,我不能得到一个水平滚动条。
这是我的xaml:

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"           
        Title="MainWindow" Height="150" Width="250">
    <Grid>
        <Grid.ColumnDefinitions>  
            <ColumnDefinition Width="200"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>    
            <RowDefinition Height="100"/>
        </Grid.RowDefinitions>           
        <ScrollViewer Grid.Row="0" Grid.Column="0">
            <ItemsControl  ItemsSource="{Binding Path=BoundTexts}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=Text}"/>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Vertical"/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
        </ScrollViewer>
    </Grid>
</Window>

下面是要测试的代码。

using System.Collections.Generic;
using System.Windows; 

namespace WpfApp1

{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            List<BoundClass> temp = new List<BoundClass>();
            for (int i = 0; i < 10; i++)
            {
                string t = ""; // just to create some long strings.
                for (int j = 0; j < 10; j++) // I know it can be done better.
                {
                    t += $"{j*10:D2}********";
                }               
                temp.Add(new BoundClass(t));
            }
            BoundTexts = temp.ToArray();
            DataContext = this;
        }       

        public BoundClass[] BoundTexts { get; set; }
    } 

    public class BoundClass
    {
        public string Text { get; set;}
        public BoundClass(string text)
        {
            Text = text;
        }
    }
}

我知道这里有一些类似的问题,但据我所见,它们都被模板和其他复杂的主题所笼罩。还有一些是由“确保你有一个约束容器围绕它”来回答的,我想我是由网格来回答的。

rlcwz9us

rlcwz9us1#

ScrollViewer.HorizontalScrollBarVisibilityScrollViewer.VerticalScrollBarVisibility设置为"Auto"就可以了。
VerticalScrollBarVisibility的默认值为ScrollBarVisibility.VisibleHorizontalScrollBarVisibility的默认值为ScrollBarVisibility.Disabled**。因此,仅设置HorizontalScrollBarVisibility = "Auto"应该足够均匀

<ScrollViewer Grid.Row="0" Grid.Column="0" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
djmepvbi

djmepvbi2#

ScrollViewer添加到ItemsControl的正确方法是将其放入ControlTemplate以 Package ItemsPresenter。这样ScrollViewer就可以正常工作。
如果你不这样做(而是 Package ItemsControl),ScrollViewer将试图滚动ItemsControl,而不是项目!
但是你想让ScrollViewer检测ItemsControl的溢出,自然,ItemsControl本身会拉伸以占据可用空间-它不会溢出,并且会正确显示(完全可见),但是项目确实溢出了ItemsControl的空间,这就是为什么 Package ItemsControl不会像预期的那样工作。
此外,您必须显式启用ScrollViewer.HorizontalScrollBarVisibility。请务必了解,将其设置为Auto将影响性能。建议将其设置为HiddenVisible

<ItemsControl Height="200">
  <ItemsControl.Template>
    <ControlTemplate TargetType="ItemsControl">
      <ScrollViewer CanContentScroll="True"
                    HorizontalScrollBarVisibility="Visible"
                    VerticalScrollBarVisibility="Visible">
        <ItemsPresenter />
      </ScrollViewer>
    </ControlTemplate>
  </ItemsControl.Template>

  <!-- Consider to enable virtualization by adding a VirtualizingStackPanel as host Panel.
       Important: don't forget to set ScrollViewer.CanContentScroll to 'True' -->
  <ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
      <VirtualizingStackPanel />
    </ItemsPanelTemplate>
  </ItemsControl.ItemsPanel>
</ItemsControl>

相关问题