我们正在 WPF 中开发触摸应用程序。我们的 ScrollViewers 将属性 PanningMode 设置为 Both 以启用滑动滚动。当在空白区域甚至在 CheckBox 和 ComboBox 控件上滑动时,此功能效果很好。
但是,当在文本框上滑动(将手指短暂地放在文本框上并向上或向下移动)时,ScrollViewer 不会滚动。有没有办法在所有控件上启用滑动滚动并仅将它们集中在点击上?
可以使用以下代码重现此行为:
<Window x:Class="WpfSandbox.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<ScrollViewer PanningMode="Both">
<StackPanel>
<TextBox Margin="5"></TextBox>
<TextBox Margin="5"></TextBox>
<TextBox Margin="5"></TextBox>
<TextBox Margin="5"></TextBox>
<TextBox Margin="5"></TextBox>
<TextBox Margin="5"></TextBox>
<TextBox Margin="5"></TextBox>
<TextBox Margin="5"></TextBox>
<CheckBox Margin="5" />
<CheckBox Margin="5" />
<CheckBox Margin="5" />
<CheckBox Margin="5" />
<CheckBox Margin="5" />
<CheckBox Margin="5" />
<CheckBox Margin="5" />
<CheckBox Margin="5" />
<ComboBox Margin="5" />
<ComboBox Margin="5" />
<ComboBox Margin="5" />
<ComboBox Margin="5" />
<ComboBox Margin="5" …Run Code Online (Sandbox Code Playgroud) 顺便说一句,我正在使用 UWP 以防万一。所以我使用的是 ListView 并且默认情况下所有 ListView 都有一个 ScrollViewer 附加到它们(在默认模板中)。问题是我找不到在 ListView 完成滚动时触发的事件(在 ListView 本身或其 ScrollViewer 上)。
我使用 scrollViewer.ChangeView() 方法自动滚动到 ListView 的开头,它使用动画滚动到顶部,所以我认为这与它有关,因为 ViewChanged 事件在动画完成之前触发。如果我对此是正确的,那么必须有一种方法来确定动画是否完成,因为我需要在 ListView 再次完全空闲时收到警报,这仅是在滚动动画完成时。谢谢。
我想知道ScrollViewer.ScrollToHome()和之间的实际区别是什么ScrollViewer.ScrollToTop()。他们是一样的吗?
两者的文档说:
垂直滚动到 ScrollViewer 内容的开头。
我认为在 .NET Framework 中使用不同名称的两种方法做同样的事情是非常不寻常的。是吗?
我有一个元素集合,每个元素都有一个名称和一个图像blob的子集合.我想显示一个Accordion,每个项目代表每个MainElements.在每个元素内部,我在所述MainElement的子集合中显示图像.Accordion会被用户调整大小,因此我使用了一个wrappanel来呈现图像.当手风琴足够宽时,图像重新排序,每个排列的数量与每行中的可能性一致.当wrappanel每行只显示一个图像时会出现问题(因为没有足够的空间可供更多),图像列表会继续,但我看不到所有图像,因为它们不适合控件的高度.我需要在AccordionItem内显示一个垂直滚动条,以便我可以向下滚动图像列表.所以,这是我的代码:
<layoutToolkit:Accordion Width="Auto" Height="Auto" ItemsSource="{Binding MainElementCollection}">
<layoutToolkit:Accordion.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding MainElementName}" />
</DataTemplate>
</layoutToolkit:Accordion.ItemTemplate>
<layoutToolkit:Accordion.ContentTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding SubElementCollection}" ScrollViewer.VerticalScrollBarVisibility="Auto" >
<ItemsControl.Template>
<ControlTemplate>
<controlsToolkit:WrapPanel />
</ControlTemplate>
</ItemsControl.Template>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Image Margin="2" Width="150" Source="{Binding PreviewImage, Converter={StaticResource ImageConverter}}" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
</layoutToolkit:Accordion.ContentTemplate>
</layoutToolkit:Accordion>
Run Code Online (Sandbox Code Playgroud)
http://www.silverlightshow.net/tips/How-to-add-scrollbars-to-ItemsControl.aspx建议我应该用一个scrollviewer环绕我的wrappanel,就像这样
<ItemsControl.Template>
<ControlTemplate>
<scrollviewer>
<controlsToolkit:WrapPanel />
</scrollviewer>
</ControlTemplate>
</ItemsControl.Template>
Run Code Online (Sandbox Code Playgroud)
但是后来我的包装变得非常小,我只能看到一个小的垂直滚动条任何想法?非常感谢.
编辑:我认为当在controltemplate中使用时,wrappanel会失去其宽度
它应该如下使用:
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<controlsToolkit:WrapPanel ScrollViewer.VerticalScrollBarVisibility="Visible" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
Run Code Online (Sandbox Code Playgroud)
无论如何,我尝试添加ScrollViewer.VerticalScrollBarVisibility ="Visible"行,但我又被卡住了.
再次编辑:
现在我的包装袋看起来像这样:
<ItemsControl ItemsSource="{Binding StageVideos}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<controlsToolkit:WrapPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate> …Run Code Online (Sandbox Code Playgroud) silverlight wrappanel itemtemplate itemscontrol scrollviewer
我创建了一个继承自WPF的自定义画布控件Canvas.我在主窗口中使用它 -
<ScrollViewer
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto">
<RTD:RTDesignerCanvas
Margin="5"
Background="White"
x:Name="canvas1"
Focusable="True"
AllowDrop="True">
</RTD:RTDesignerCanvas>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)
一切正常,但是当我尝试像这样设置控件的位置时
Canvas.SetTop(item, 200);
滚动条不可见,控件隐藏在某处.有趣的是,如果我向其添加另一个控件滚动条是可见的,我可以向下滚动以查看上一个控件.
我试着用
base.InvalidateVisual();
base.UpdateLayout();
base.InvalidateArrange();
Run Code Online (Sandbox Code Playgroud)
更换物品后Top或Left没有任何反应; 我错过了什么或者由于某些错误而发生这种情况?
更新:
澄清,说我有有它的画布width,height100,100.现在,如果我用移动的控制(在画布上已添加),Canvas.SetLeft(myControl, 200)然后它会移动到这是默认情况下不可见,并且滚动条也被禁止的位置,所以没有办法看到那种控制.
现在,如果我向Canvas添加另一个控件,ScrollBars会正确显示,我可以通过滚动查看上一个控件.
我在列表框中显示图像.我已将此列表框放在scrollviewer中.我使用两个重复按钮来移动列表框项目.我使用datacontext绑定列表框.
问题:
如果我使用按钮移动图像并单击lisbox中的图像,它将移动到初始位置.
码:
<RepeatButton Click="rbtnLeft_Click" Name="rbtnLeft" Width="30" Height="30">
<Image Source="Images/GeneralImages/search_right_arrow.jpg"></Image>
</RepeatButton>
<Grid x:Name="grid" Width="666" HorizontalAlignment="Left">
<ScrollViewer Grid.Row="1" Name="svGame"
VerticalScrollBarVisibility="Hidden"
HorizontalScrollBarVisibility="Hidden" >
<ListBox ClipToBounds="True" Name="lbGameImage" Width="Auto" SelectionChanged="lbGameImage_SelectionChanged" ItemsSource="{Binding}" ItemsPanel="{DynamicResource iptListBox}" ItemContainerStyle="{DynamicResource ListBoxItemStyle}"
ScrollViewer.VerticalScrollBarVisibility="Hidden"
ScrollViewer.HorizontalScrollBarVisibility="Hidden"/>
</ScrollViewer>
</Grid>
<RepeatButton Click="rbtnRight_Click" Name="rbtnRight" Width="30" Height="30">
<Image Source="Images/GeneralImages/search_left_arrow.jpg"></Image>
</RepeatButton>
Run Code Online (Sandbox Code Playgroud)
c#代码:
private void rbtnLeft_Click(object sender, RoutedEventArgs e)
{
svGame.ScrollToHorizontalOffset(svGame.HorizontalOffset + 5);
}
private void rbtnRight_Click(object sender, RoutedEventArgs e)
{
svGame.ScrollToHorizontalOffset(svGame.HorizontalOffset - 5);
}
Run Code Online (Sandbox Code Playgroud) 我有很多项目(0-100)最终需要滚动到包含它的Listbox的底部.我试过:
ScrollViewer.SetVerticalScrollBarVisibility(listmy, ScrollBarVisibility.Auto);
listmy.SelectedItem = listmy.Items.Count-1;
listmy.ScrollIntoView(listmy.SelectedItem);
ScrollViewer.SetVerticalScrollBarVisibility(listmy, ScrollBarVisibility.Disabled);
Run Code Online (Sandbox Code Playgroud)
但是这对我不起作用.scrollviewer包装了列表框和文本框.(列表框垂直滚动处于禁用状态).UPD xaml:
<Grid>
<ScrollViewer Name="_ScrollViewer" VerticalScrollBarVisibility="Auto">
<StackPanel Name="stackPanel" Height="auto">
<ListBox ScrollViewer.VerticalScrollBarVisibility="Disabled" x:Name="listmy">
<ListBox.ItemTemplate>
<DataTemplate>...
Run Code Online (Sandbox Code Playgroud)
和cs:
listmy.ItemsSource = ((App)Application.Current).DIALOG;
ScrollViewer.SetVerticalScrollBarVisibility(listmy, ScrollBarVisibility.Auto);
listmy.SelectedIndex = listmy.Items.Count-1;
listmy.ScrollIntoView(listmy.SelectedItem);
ScrollViewer.SetVerticalScrollBarVisibility(listmy, ScrollBarVisibility.Disabled);
Run Code Online (Sandbox Code Playgroud) 下面的代码是问题的完整表示.基本上,当我在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 …Run Code Online (Sandbox Code Playgroud) 免责声明:我知道这不是组织此布局的最佳方法,但这实际上是我发现的最简单的表示形式,它再现了我在更为精细的布局中遇到的问题,因此请不要提供会重新组织图层的解决方案
这是xaml:
<Window x:Class="Test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Text Project">
<!--background grid-->
<Grid>
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
<!--two columns layout-->
<Grid MinWidth="600">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
<Grid MinWidth="200" Background="Red"/>
</ScrollViewer>
<GridSplitter HorizontalAlignment="Right" VerticalAlignment="Stretch" Width="6"/>
<ScrollViewer Grid.Column="1" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
<Grid MinWidth="200" Background="Blue"/>
</ScrollViewer>
</Grid>
</ScrollViewer>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
目标如下:-如果我将窗口调大,一切都会缩放-如果我调小,当我达到minWidth时,最顶部的滚动查看器上的scroolbar出现,并且其内容停止缩小。(这部分工作正常)-不管最顶部的scrollviewer的大小如何,我都可以使用gridsplitter调整两列的大小-当我达到一列的最小宽度时,滚动条将出现在该列的scrollviewer上,并且其内容停止缩小
问题:第二部分永远不会发生。我得到的是可以调整大小,直到达到两个子网格的minWidth之一,然后网格分割器停止移动,无法进一步缩小并且滚动条永远不会出现。
我注意到,如果删除最上面的网格及其关联的scrollviewer,它将按预期工作:
<Window x:Class="Test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Text Project">
<!--two columns layout-->
<Grid MinWidth="600">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
<Grid MinWidth="200" Background="Red"/> …Run Code Online (Sandbox Code Playgroud) 在这里开发一个Windows 10 UWP(通用Windows平台)应用程序......我有一个很长的文本,我不想把它包装成几行.我希望它很长,以便最终用户可以水平滚动以在一行中查看整个文本.
<ScrollViewer HorizontalScrollMode="Enabled" Width="Auto">
<TextBlock Text="This is a long text that I don't want it to be wrapped in multiple lines. I want it to be horizontally long so the user can horizontally scroll to see the text"
Margin="50, 50, 0, 0"></TextBlock>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)
但是当我运行应用程序时,文本在右边缘被切断,我不能水平滚动它以查看文本的其余部分.有没有办法使用带有一些附加属性的ScrollView来实现?这是应用程序外观的屏幕截图.
scrollviewer ×10
c# ×6
wpf ×6
.net ×2
listbox ×2
silverlight ×2
uwp ×2
canvas ×1
gridsplitter ×1
itemscontrol ×1
itemtemplate ×1
layout ×1
listview ×1
touch ×1
wrappanel ×1
xaml ×1