问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

WPF中一些控件怎么后台使用ScrollViewer,也就是把里面的滚动条去掉

发布网友 发布时间:2022-04-27 08:50

我来回答

2个回答

懂视网 时间:2022-04-27 13:11

在前端 UI 开发中,有时,我们会遇到这样的需求:在一个 ScrollViewer 中有很多内容,而我们需要实现在执行某个操作后能够定位到其中指定的控件处;这很像在 HTML 页面中点击一个链接后定位到当前网页上的某个 anchor。

要实现它,首先我们需要看 ScrollViewer 为我们提供的 API,其中并没有类似于 ScrollToControl 这样的方法;在它的几个以 ScrollTo 开头的方法中,最合适的就是 ScrollToVerticalOffset 这个方法了,这个方法接受一个参数,即纵向的偏移位置。那么,很重要的问题:我们怎么能得到要定位的那个控件在 ScrollViewer 中的位置呢?

在我之前写的这篇文章中:XAML: 获取元素的位置,有如何获到元素相对位置的介绍,建议大家先了解一下,其中使用了 Visual.TransformToVisual 方法等。当你理解了这篇文章后,再回过头来看本文后面的内容,就很容易了。

接下来,我们使用以下代码,即可实现上述需求:

// 获取要定位之前 ScrollViewer 目前的滚动位置
 var currentScrollPosition = ScrollViewer.VerticalOffset;
 var point = new Point(0, currentScrollPosition);

 // 计算出目标位置并滚动
 var targetPosition = TargetControl.TransformToVisual(ScrollViewer).Transform(point);
 ScrollViewer.ScrollToVerticalOffset(targetPosition.Y);

另外,由于通常情况下,我们会采用 MVVM 模式,因此我们可以将上述代码封装成一个 Action,而避免在 Code-Behind 代码文件中添加上述代码。

新创建的名为 ScrollToControlAction 的 Action,在其中定义两个依赖属性 ScrollViewer 和 TargetControl,分别表示指定的要操作的 ScrollViewer 和要定位到的控件,然后将上述代码放到其 Invoke 方法中即可。由于 Action 并非本文主题,所以这里并不会展开太多的讲解,可以参考以下代码或本文后提供的 Demo 作进一步了解。

namespace ScrollTest
{
 /// <summary>
 /// 在 ScrollViewer 中定位到指定的控件
 /// 说明:目前支持的是垂直滚动
 /// </summary>
 public class ScrollToControlAction : TriggerAction<FrameworkElement>
 {
 public static readonly DependencyProperty ScrollViewerProperty =
 DependencyProperty.Register("ScrollViewer", typeof(ScrollViewer), typeof(ScrollToControlAction), new PropertyMetadata(null));

 public static readonly DependencyProperty TargetControlProperty =
 DependencyProperty.Register("TargetControl", typeof(FrameworkElement), typeof(ScrollToControlAction), new PropertyMetadata(null));

 /// <summary>
 /// 目标 ScrollViewer
 /// </summary>
 public ScrollViewer ScrollViewer
 {
 get { return (ScrollViewer)GetValue(ScrollViewerProperty); }
 set { SetValue(ScrollViewerProperty, value); }
 }

 /// <summary>
 /// 要定位的到的控件
 /// </summary>
 public FrameworkElement TargetControl
 {
 get { return (FrameworkElement)GetValue(TargetControlProperty); }
 set { SetValue(TargetControlProperty, value); }
 }

 protected override void Invoke(object parameter)
 {
 if (TargetControl == null || ScrollViewer == null)
 {
 throw new ArgumentNullException($"{ScrollViewer} or {TargetControl} cannot be null");
 }

 // 检查指定的控件是否在指定的 ScrollViewer 中
 // TODO: 这里只是指定离它最近的 ScrollViewer,并没有继续向上找
 var container = TargetControl.FindParent<ScrollViewer>();
 if (container == null || container != ScrollViewer)
 {
 throw new Exception("The TargetControl is not in the target ScrollViewer");
 }

 // 获取要定位之前 ScrollViewer 目前的滚动位置
 var currentScrollPosition = ScrollViewer.VerticalOffset;
 var point = new Point(0, currentScrollPosition);

 // 计算出目标位置并滚动
 var targetPosition = TargetControl.TransformToVisual(ScrollViewer).Transform(point);
 ScrollViewer.ScrollToVerticalOffset(targetPosition.Y);
 }
 }
}

其使用方法如下:

<Button>
 <i:Interaction.Triggers>
 <i:EventTrigger EventName="Click">
 <local:ScrollToControlAction ScrollViewer="{Binding ElementName=s}" TargetControl="{Binding ElementName=txtSectionC}" />
 </i:EventTrigger>
 </i:Interaction.Triggers>
</Button>

至此,结合 Action,我们以非常灵活的方式实现了本文所提出的需求。

 源码下载

 

热心网友 时间:2022-04-27 10:19

xxx.VerticalScrollBarVisibility = ScrollBarVisibility.Hidden;追问

你果断都是秒回啊!

但是我也是这样加的,但是报错!

追答晕,你用在DocumentViewer上自然不是这么写的。这是附加属性
ScrollViewer.SetVerticalScrollBarVisibility(documentViewer, ScrollBarVisibility.Hidden);

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...要名句哦,四言七言都行,希望各位哥哥姐姐帮帮忙,谢谢啦~_百度... 怎么进入华为tm800moden界面 前两天感冒发烧,打了几针,现在还没全好,这两天牙根部分脸上肌肉痛,尤... 做完爱有点血特别淡是怎么回事 为什么跟女的做爱做完的时候会流血为什么跟女的做完爱会流?_百度... 刚做完爱怎么会出血 西德意志汇报报社发展 法兰克福汇报的发展历史 法兰克福汇报社会影响 法兰克福汇报的报纸简介 #陌陌直播间有些主播有标注美妆达人,并且能够在直播间里卖东西,点进去会自动进入淘宝的店铺是怎么申请 末位同分是并列的意思吗? 2021届番禺香江育才学校名额分配 元旦快乐︱开一家儿童游乐园怎么样? 各地政协的公务员是属于国家的还是地方的 县级参公管理单位有哪些? 喜欢一个人和不甘心不舍的放弃还有喜欢被他呵护的感觉有啥区别么 怎样区别对他到底是喜欢还是不甘 县政协办公室副主任是公务员吗 你们说,男人变心变的快吗? Ios 7如何设置其他歌曲为铃声? 其实男人变心是不是都很快 ios7.1怎么设置铃声 网络拓扑图,光纤专线接---防火墙---路由器---交换机---PC,我还有个硬件网关,问下网关组建在那块 现在我有防火墙,路由器和交换器,一组服务器。用户通过互联网访问服务器,请问要如果建立拓扑结构?谢谢 网络的拓扑结构发生变化时,防火墙的配置会不会发生变化 如何围绕一张带有防火墙的网络拓扑图进行论文的展开或者研究? 和塑料的循环标志一样,但里面没有数字,在外包装纸箱上的标记是什么意思? excel使用rank函数数据重复跳过啦排序,如图 发生在身边的关于珍惜生命的事例 《流放之路》异界中是要把怪杀完还是只杀首领? 贷款买车的坑有哪些呢 流放之路异界地图被乌云笼罩怎么破 买车贷款应该怎样避坑? 保单贷款20万还不上怎么办 拼多多撤销售后上限了怎么办 武汉市小黄家政服务公司的网站关键词排名为什么突然消失? 武汉家政服务好的? 现急需湖北人民医院附近家政人员一名 武汉没有什么好点的家政公司麽? 那个家政公司的服务员比较有保障呢? 武汉家政 武汉市家政服务中心最正规信的过的 如何做好住家保姆 如何评价电影《父辈的战争》 电影:父辈的旗帜中所涉及的战役的意义是什么 《父辈的旗帜》这个电影好看吗? 《拯救大兵瑞恩》:为何被无数影迷奉为“影史最伟大战争片”? 类似父辈的战争的电影 描写一个物品,200字左右