我按照这个关于如何将滚动条添加到ItemsControl的小"教程",它在Designer视图中工作,但是在我编译和执行程序时却没有(只显示前几个项目,没有滚动条可以查看更多 - 甚至当VerticalScrollbarVisibility设置为"Visible"而不是"Auto"时).
关于如何解决这个问题的任何想法?
这是我用来显示我的项目的代码(通常我使用Databinding,但是为了查看我的Designer中的项目,我手动添加它们):
<ItemsControl x:Name="itemCtrl" Style="{DynamicResource UsersControlStyle}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Top">
</StackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<uc:UcSpeler />
<uc:UcSpeler />
<uc:UcSpeler />
<uc:UcSpeler />
<uc:UcSpeler />
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)
这是我的模板:
<Style x:Key="UsersControlStyle" TargetType="{x:Type ItemsControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ItemsControl}">
<Border SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}">
<ScrollViewer VerticalScrollBarVisibility="Visible">
<ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</ScrollViewer>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud) 在下面的例子中,我有一个ListBox,里面有几十个字体名称.
我原以为它会自动在它上面有一个垂直滚动条,这样你就可以选择任何字体,而不仅仅是列表中的第一个字体,但事实并非如此.
所以我添加了一个"ScrollViewer"并在右侧放置了一个"滚动条区域",但滚动条区域中没有滚动条,因此您可以滚动(!).
为什么滚动条不是自动的,如何强制滚动条?
<StackPanel Name="stack1">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="2*"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<ScrollViewer>
<ListBox Grid.Row="0" Name="lstFonts" Margin="3" ItemsSource="{x:Static Fonts.SystemFontFamilies}"/>
</ScrollViewer>
</Grid>
</StackPanel>
Run Code Online (Sandbox Code Playgroud) 在下面的WPF XAML中,ScrollViewer不起作用(它显示滚动条但不能滚动,内容从窗口向下移动到底部).
我可以将外部StackPanel更改为Grid,它将起作用.
但是,在我复制以下代码的应用程序中,我需要一个外部StackPanel.我需要对StackPanel做什么才能让ScrollViewer显示一个可用的滚动条?例如VerticalAlignment ="Stretch"Height ="Auto"不起作用.
<StackPanel>
<ScrollViewer>
<StackPanel>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a …
Run Code Online (Sandbox Code Playgroud) 我目前正在开发我的第一个WPF项目并试图使listview可滚动.起初我认为这可以通过简单地限制列表视图的宽度和高度来轻松完成,从而当内容超出其空间时强制滚动条自动出现.这看起来很好,但由于处理的PreviewMouseDown-Event(可以拖动列表的项目),它在选择项目后不起作用.
第二次尝试(使用ScrollViewer)
<ScrollViewer>
<ListView ItemsSource="{Binding FileViewModels}"
PreviewMouseDown="ListView_MouseMove"
Height="450" Width="200"/>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)
当然,只要列表的内容大于其最大高度,就会产生第二个滚动条.选择项目后拖动栏仍然无效.
第三次(非常愚蠢)尝试(禁用滚动条复制)
<ScrollViewer>
<ListView ItemsSource="{Binding FileViewModels}"
PreviewMouseDown="ListView_MouseMove"
Height="450" Width="200"
ScrollViewer.VerticalScrollBarVisibility="Disabled"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"/>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)
这删除了滚动条复制并启用了通过鼠标滚轮滚动但禁用了滚动条,因此您无法通过单击并拖动它来移动.
第四次尝试(ScrollViewer的常量)
<ScrollViewer Height="450" Width="200">
<ListView ItemsSource="{Binding FileViewModels}"
PreviewMouseDown="ListView_MouseMove"/>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)
从ListView中删除了宽度/高度约束并将其移动到ScrollViewer.这将启用滚动条并删除重复项.不幸的是鼠标滚轮不再工作(拖动滚动条工作正常).
有人可以向我解释为什么鼠标滚轮不再工作以及如何解决这个问题?
编辑 也许我应该回到我的第一个解决方案.显然,ListView的模板已经包含ScrollViewer.剩下的问题是,由于处理的PreviewMouseDown事件,我在选择项目后无法拖动滚动条(在这种情况下,通过鼠标滚轮滚动仍然有效).我是否应该以不同的方式处理项目的拖动(在我想要添加滚动条之前,它对我来说很好)?或者有没有办法检测光标是否在滚动条上方(这样我就可以取消选择能够滚动的项目)?或者还有其他建议吗?
我希望我Canvas
自动调整大小到其项目的大小,以便ScrollViewer
滚动条具有正确的范围.这可以在XAML中完成吗?
<ScrollViewer HorizontalScrollBarVisibility="Auto" x:Name="_scrollViewer">
<Grid x:Name ="_canvasGrid" Background="Yellow">
<Canvas x:Name="_canvas" HorizontalAlignment="Left" VerticalAlignment="Top" Background="Green"></Canvas>
<Line IsHitTestVisible="False" .../>
</Grid>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,画布的大小始终为0,但它不会剪切其子元素.
我正在小型设备上使用触摸屏,滚动条的自定义宽度并不好,因为我的要求之一就是手指手势都需要一切.
如何设置WPF ScrollViewer滚动条的宽度?
请注意,我不想更改设备上所有滚动条的宽度(可以通过Windows设置) - 只有我的应用程序中的滚动条.
应用程序
我正在构建一个包含范围选择器的应用程序.这包含Slider
一个UserControl
派生类中包含的两个自定义绘制控件.然后,范围选择器控件包含在ScrollViewer
大多数时间都可见的HorizonalScrollBar中.
示例应用程序代码:(文本墙的应用)
Window.xaml(Window文件):
<Grid>
<ScrollViewer x:Name="ScrollViewer" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Disabled">
<local:SliderTest x:Name="slider"
LowerValue="0"
UpperValue="10"
Minimum="0"
Maximum="100" Width="900" Height="165" Padding="15,0,15,0" HorizontalAlignment="Left">
</local:SliderTest>
</ScrollViewer>
</Grid>
Run Code Online (Sandbox Code Playgroud)
SliderTest.xaml:
<UserControl x:Class="scrollviewerDemoProblem.SliderTest"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
x:Name="root"
xmlns:local="clr-namespace:scrollviewerDemoProblem"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
<ControlTemplate x:Key="simpleSlider" TargetType="{x:Type Slider}">
<Border SnapsToDevicePixels="true" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" MinHeight="{TemplateBinding MinHeight}"/>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Track x:Name="PART_Track" Grid.Row="1">
<Track.Thumb>
<Thumb x:Name="Thumb" FlowDirection="LeftToRight" Width="15">
<Thumb.Template>
<ControlTemplate TargetType="Thumb">
<Canvas>
<Path x:Name="test1" StrokeThickness="0" …
Run Code Online (Sandbox Code Playgroud) 我在我的堆栈面板周围使用了一个包含ItemsControl的scrollviewer控件.如果ItemsControl中有许多项目,则可以滚动,但由于某种原因,它只是剪切项目.这是代码:
<StackPanel>
<ScrollViewer CanContentScroll="True" VerticalScrollBarVisibility="Visible">
<ItemsControl Name="icEvents" Width="Auto" Height="100" Background="AliceBlue"
ItemsSource="{Binding Path=EventSources}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="Source:"/>
<TextBlock Text="{Binding Path=Source}" />
<TextBlock Text="Original Source:"/>
<TextBlock Text="{Binding Path=OriginalSource}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</StackPanel>
Run Code Online (Sandbox Code Playgroud) 正如大多数WPF开发人员所知,设置ScrollViewer.CanContentScroll
为false
禁用虚拟化; 但我想知道它是如何工作的,因为我尝试启用虚拟化,同时设置ScrollViewer.CanContentScroll
到false
.
我在使用鼠标滚轮在以下XAML中工作时遇到问题,为简化起见,我已简化了这一点:
<ScrollViewer
HorizontalScrollBarVisibility="Visible"
VerticalScrollBarVisibility="Visible"
CanContentScroll="False"
>
<Grid
MouseDown="Editor_MouseDown"
MouseUp="Editor_MouseUp"
MouseMove="Editor_MouseMove"
Focusable="False"
>
<Grid.Resources>
<DataTemplate
DataType="{x:Type local:DataFieldModel}"
>
<Grid
Margin="0,2,2,2"
>
<TextBox
Cursor="IBeam"
MouseDown="TextBox_MouseDown"
MouseUp="TextBox_MouseUp"
MouseMove="TextBox_MouseMove"
/>
</Grid>
</DataTemplate>
</Grid.Resources>
<ListBox
x:Name="DataFieldListBox"
ItemsSource="{Binding GetDataFields}"
SelectionMode="Extended"
Background="Transparent"
Focusable="False"
>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemContainerStyle>
<Style
TargetType="ListBoxItem"
>
<Setter
Property="Canvas.Left"
Value="{Binding dfX}"
/>
<Setter
Property="Canvas.Top"
Value="{Binding dfY}"
/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
</Grid>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)
在视觉上,结果是一些已知大小的区域,其中DataField
从集合中读取的s可以用TextBox
具有任意位置,大小等的es 来表示.如果ListBox
"样式"区域"太大而无法一次显示",则可以进行水平和垂直滚动,但只能使用滚动条.
为了更好的人体工程学和理智,鼠标滚轮应该是可能的,并且通常ScrollViewer
会自动处理它,但ListBox
似乎是处理这些事件,使父母ScrollViewer
永远不会看到它们.到目前为止,我只能够得到滚轮滚动的工作是设定IsHitTestVisible=False
为无论是ListBox …
scrollviewer ×10
wpf ×10
wpf-controls ×3
.net ×2
listbox ×2
mousewheel ×2
xaml ×2
c# ×1
itemscontrol ×1
resize ×1
scrollbar ×1
stackpanel ×1
width ×1