我是WPF的新手,ScrollViewer令我很沮丧.或者我只是不"得到"它,或者它是一个有限的控制.
这是我的挫折:
水平滚动错误水平滚动条仅在列表底部可见(我必须滚动到底部才能看到它)
坏边框我的ScrollViewer中有一个ListBox.当我开始列表的底部没有边框时,当我向下滚动时,列表框的顶部边框(行)消失.我可以理解这一点,但尝试为ScrollViewer设置BorderThickness或BorderBrush结果没有变化(我想使用ScrollViewer的边框在列表内容周围保留一个常量框,就像网络世界中的大多数列表框一样).
短列表处理不当当列表中的项目未到达底部时,ScrollViewer会将滚动条保留在那里并将其抖动.为什么不释放一些空间并将其删除?
其中一些可能看起来很小(而且它们是).但是用户期望从他们的应用程序中获得一定的外观和感觉,而WPF则很难将其开箱即用.
如果你知道如何解决这些问题,我会很乐意回应.如果有一个更好的方法来处理滚动比使用ScrollViewer,欢迎.
执行以下操作将重现我的问题:
Debug.Print(“发生双击事件”)
如何更改此行为,以便MouseDoubleClick仅在鼠标“位于” ListViewItems上时发生,而不是在连续单击ScrollViewer在列表中向下/向上滚动时才发生?
我正在使用ScrollViewer来显示图像.Image将ScaleTransform设置为LayoutTransforms之一.我已经设置好将图像的宽度调整到ScrollViewer的ActualSize中.我的问题是,如果图像高度需要存在垂直滚动条(我将其设置为自动),那么我的图像会缩放一点点.我知道如何确定滚动条是否存在以及如何获得正确的比例,但我无法弄清楚如何确定滚动条的实际宽度.我想我可以猜它,但是如果我稍后在我的应用程序中添加样式会导致滚动条的大小不同,我想要一些可行的东西.另外,我也正在做适合高度,并且当它可见时需要获得水平滚动条的高度(我假设获得垂直滚动条的宽度的答案将使得获得水平滚动条的高度明显).
我的wpf应用程序的结构如下:
<Scrollviewer>
<Grid>
<Scrollviewer>
<DataGrid>
Run Code Online (Sandbox Code Playgroud)
我的目标是,如果DataGrid超过屏幕的高度,则使用它自己的Scrollviewer.在Moment只使用外部ScrollViewer,所以我必须滚动整个网格.
有人可以告诉我该怎么做?
我在主窗口中有以下代码(缩写):
虽然我设置了滚动条可见性和CanContentScroll属性,但它不会滚动.我认为它与我的用户控件有关.
<Window>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TabControl Grid.Column="0" Grid.Row="0" HorizontalAlignment="Stretch" Margin="0" VerticalAlignment="Stretch" Height="Auto" Width="Auto">
<TabItem Header="TEST">
<ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
<my:MY_USER_CONTROL x:Name="myUserControl" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ScrollViewer.CanContentScroll="True" />
</ScrollViewer>
</TabItem>
</TabControl>
<Button Grid.Column="0" Grid.Row="2" >a button</Button>
<WrapPanel Grid.Column="0" Grid.Row="3" >
</WrapPanel>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
我的用户控件的缩写结构:
<UserControl>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="183*" />
<ColumnDefinition Width="117*" />
</Grid.ColumnDefinitions>
<TreeView ItemsSource="{Binding Children}" Grid.ColumnSpan="2">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" …Run Code Online (Sandbox Code Playgroud) 我知道如何只做其中一个req,而不是两个.
为了加载大图像并能够滚动查看其所有部分,我在a里面添加了图像<ScrollViewer/>并得到了我需要的东西.
为了在图像上绘图,我能够将该图像作为背景加载<Canvas/>.
但如何实现两者?
基本上,我有一个非常大的图像,我不想缩小,并且该图像上有一堆房间(就像建筑物的平面图).我有房间的坐标,当用户在房间内点击时,我想用颜色填充那个房间(目前我只有一个列表框,上面写着"房间1已被点击").
编辑XAML(用于缩小图像):
<Grid Margin="10">
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="*" />
<RowDefinition Height="200" />
</Grid.RowDefinitions>
<ComboBox x:Name="buildingCombo" Grid.Row="0" ItemContainerStyle="{DynamicResource ComboItemStyle}" Tag="{Binding}"
Template="{StaticResource ComboBoxTemplate}" Width="1000" SelectionChanged="buildingCombo_SelectionChanged"/>
<Grid Grid.Row="1">
<ScrollViewer Grid.Column="0" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<Canvas Width="{Binding ActualWidth, ElementName=image}" Height="{Binding ActualHeight, ElementName=floorPlanImage}" >
<Canvas.Background>
<VisualBrush >
<VisualBrush.Visual>
<Image Grid.Column="0" Stretch="None" x:Name="floorPlanImage" MouseLeftButtonDown="Image_MouseLeftButtonDown"/>
</VisualBrush.Visual>
</VisualBrush>
</Canvas.Background>
</Canvas>
</ScrollViewer>
</Grid>
<DataGrid Grid.Row="2" ColumnHeaderStyle="{DynamicResource GridViewColumnHeaderStyle}" Background="LightGray" RowBackground="LightYellow" AlternatingRowBackground="LightBlue"
x:Name="dataGridViewRoomQuery" BorderBrush="Gray" BorderThickness="5"/>
</Grid>
Run Code Online (Sandbox Code Playgroud) 我正在尝试使我的滚动查看器完美滚动,即我有一个scrollviewer并且它包含一个stackpanel,堆栈面板包含一个用户自定义的用户控件.它们可以在运行时动态增加或减少.
问题是,假设我的堆栈面板中只有2个用户控件,滚动查看器只有2个级别的滚动,因此它为每次单击或鼠标滚轮移动滚动整个用户控件.
我怎么能改变呢?它是属性还是设计中存在错误?
这是它的xaml代码:
<ScrollViewer HorizontalAlignment="Left" Height="420" VerticalAlignment="Top" Width="862" Margin="0,0,-2,0" CanContentScroll="True" PanningRatio="0.1">
<StackPanel x:Name="hpList" HorizontalAlignment="Left" Height="422" VerticalAlignment="Top" Width="843"/>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)
并且堆栈面板动态扩展或收缩.
我在ListView样式中有一个ScrollViewer,但我找不到属性来摆脱右下角,如屏幕截图所示.

出于属性设置背景颜色的任何想法?
尝试在双击事件触发的Windows应用商店应用中缩小滚动视图.
这是它应该发生的代码
private void MainPhotoDisplay_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
{
MainPhotoDisplayscrollViewer.ChangeView(null, null, 1.0F,true);
}
Run Code Online (Sandbox Code Playgroud)
但如果我放大,在模拟器中,然后双击,没有任何反应.事件触发并且方法运行但没有任何反应,视图仍然处于放大状态.
这是它的文档:http://msdn.microsoft.com/en-us/library/windows/apps/dn252762.aspx
这个过时的方法:
MainPhotoDisplayscrollViewer.ZoomToFactor(1);
Run Code Online (Sandbox Code Playgroud)
工作得很好,但遗憾的是它没有动画,这会导致糟糕的用户体验.并不是我想要的.
关于为什么没有发生的任何想法?
我目前正在使用WPF开发应用程序.而且我不得不注意到与Windows Store App变体相比ScrollViewer功能的差异.
当我在屏幕的边缘和ScrollViewer的边缘时,我想要滑动,以便我离开边缘.我看到Windows桌面或菜单栏(在屏幕的底部).有没有解决方案来防止这种滚动行为发生?当你滚动到屏幕的边缘然后被撞回来看到下面的一些Windows平台时,它相当烦人(而且很丑!).Windows应用程序ScrollViewer中已修复此问题.
我尝试覆盖ScrollChanged并检查fe horizontalOffset == 0 && horizontalChange < 0是否返回,如果是这种情况.但这种检查似乎不起作用(从那以后它可能已经太晚了).而我似乎无法找到Windows应用商店应用程序修复此问题的方式.

也许你们有个主意吗?
编辑: .NET 4.5.1中的WPF项目的再现
这段XAML在WPF中重新创建了我的问题.但是,在Windows应用商店应用中,问题似乎不存在.
滚动到和/或覆盖应用程序边缘时,如何防止此行为?
<Window x:Class="WpfApplication1.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" ResizeMode="NoResize" WindowState="Maximized" WindowStyle="None">
<Grid>
<ScrollViewer HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden" PanningMode="Both">
<Rectangle Height="2500" Stroke="Black" Width="3500" HorizontalAlignment="Left" VerticalAlignment="Top">
<Rectangle.Fill>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0,0.5">
<GradientStop Color="#FF00FF68" Offset="0"/>
<GradientStop Color="Red" Offset="1"/>
<GradientStop Color="#FF95FF00" Offset="0.506"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
</ScrollViewer>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud) scrollviewer ×10
wpf ×9
c# ×4
background ×1
canvas ×1
double-click ×1
grid ×1
image ×1
listview ×1
scroll ×1
uiscrollview ×1
wpf-controls ×1
wpftoolkit ×1
xaml ×1