wpf下制作的简单瀑布流效果(代码片段)

lonelyxmas lonelyxmas     2022-12-04     713

关键词:

原文:WPF下制作的简单瀑布流效果

最近又在搞点小东西,美化界面的时候发现瀑布流效果比较不错.顺便就搬到了WPF,下面是界面

技术图片

 

我对WEB前端不熟,JS和CSS怎么实现的,我没去研究过,这里就说下WPF的实现思路,相当简单.

1.最重要的就是每个子项的顺序填充,我是把界面看做N列,然后在每列里依次加载子项.最后结果就是,界面放一个Uniform,设置Columns,再添加几个ItemsControl.

2.添加Item的时候,判断每个ItemsControl的实际高度,把子项添加到最小的那个ItemsControl,这样避免了某一列拉得很长.

3.再做一层封装,就变成了一个支持Binding的WaterfallControl.

 

这里上几段控件的源码,供参考:

1.WaterfallControl.cs

技术图片
  1 [TemplatePart(Name = "grdRoot", Type = typeof(UniformGrid))]
  2     public class WaterfallControl : ItemsControl
  3     
  4         private UniformGrid grdRoot;
  5 
  6         private List<ItemsControl> itemsContorls;
  7 
  8         public int Columns
  9         
 10             get  return (int)GetValue(ColumnsProperty); 
 11             set  SetValue(ColumnsProperty, value); 
 12         
 13 
 14         // Using a DependencyProperty as the backing store for Columns.  This enables animation, styling, binding, etc...
 15         public static readonly DependencyProperty ColumnsProperty =
 16             DependencyProperty.Register("Columns", typeof(int), typeof(WaterfallControl), new PropertyMetadata(3, OnColumnsChanged));
 17 
 18         private static void OnColumnsChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
 19         
 20             int columns = (int)e.NewValue;
 21             if (columns < 1)
 22             
 23                 throw new ArgumentOutOfRangeException("Columns");
 24             
 25             var control = sender as WaterfallControl;
 26             control.Columns = columns;
 27             control.InitPanel();
 28         
 29 
 30         public WaterfallControl()
 31         
 32             this.Loaded += WaterfallControl_Loaded;
 33             this.itemsContorls = new List<ItemsControl>();
 34         
 35 
 36         void WaterfallControl_Loaded(object sender, RoutedEventArgs e)
 37         
 38             this.InitPanel();
 39         
 40 
 41         private void InitPanel()
 42         
 43             if (!this.IsLoaded)
 44             
 45                 return;
 46             
 47 
 48             grdRoot.Children.Clear();
 49             itemsContorls.Clear();
 50             for (var i = 0; i < this.Columns; i++)
 51             
 52                 var ic = new ItemsControl();
 53                 ic.ItemTemplate = this.ItemTemplate;
 54                 ic.VerticalAlignment = System.Windows.VerticalAlignment.Top;
 55                 grdRoot.Children.Add(ic);
 56                 itemsContorls.Add(ic);
 57             
 58 
 59             if (this.ItemsSource != null)
 60             
 61                 var enumerator = this.ItemsSource.GetEnumerator();
 62                 while (enumerator.MoveNext())
 63                 
 64                     this.AddChild(enumerator.Current);
 65                 
 66             
 67         
 68 
 69         public override void OnApplyTemplate()
 70         
 71             base.OnApplyTemplate();
 72             grdRoot = (UniformGrid)this.GetTemplateChild("grdRoot");
 73         
 74 
 75         protected override void AddChild(object value)
 76         
 77             var ic = itemsContorls.OrderBy(t => t.ActualHeight).FirstOrDefault();
 78             ic.Items.Add(value);
 79             ic.UpdateLayout();
 80         
 81 
 82         protected override void OnItemsChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
 83         
 84             if (e.Action == NotifyCollectionChangedAction.Add || e.Action == NotifyCollectionChangedAction.Remove)
 85             
 86                 var enumerator = e.NewItems.GetEnumerator();
 87                 while (enumerator.MoveNext())
 88                 
 89                     if (e.Action == NotifyCollectionChangedAction.Add)
 90                     
 91                         this.AddChild(enumerator.Current);
 92                     
 93                     else
 94                     
 95                         foreach (var ic in this.itemsContorls)
 96                         
 97                             ic.Items.Remove(enumerator.Current);
 98                         
 99                     
100                 
101             
102         
103     
View Code

2.WaterfallControl的样式

技术图片
<Style TargetType="controls:WaterfallControl">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="controls:WaterfallControl">
                    <ScrollViewer HorizontalScrollBarVisibility="TemplateBinding ScrollViewer.HorizontalScrollBarVisibility" VerticalScrollBarVisibility="TemplateBinding ScrollViewer.VerticalScrollBarVisibility">
                        <UniformGrid Name="grdRoot" Columns="TemplateBinding Columns">

                        </UniformGrid>
                    </ScrollViewer>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
View Code

3.调用

WaterfallControl继承自ItemsControl,所以和ItemsControl的使用没有区别,只需要额外指定一个Columns即可.

 

可能遇到的问题:

1.遇到图片不能直接计算高度,可能导致某列很长.可以用扩展属性给图片指定一个初始占位高度.

2.遇到界面大小变化,列数是不是应该动态变化,这个要实现也简单,监视下Window.SizeChanged,然后改变Columns就行了.

3.我直接把ScrollViewer放到WaterfallControl的模板里了,建议抽出来,监视下滚动事件,实现滚动到底加载数据.

4.不知道是否有更简单明了的方法.

wordpress制作照片瀑布流的效果,如何实现?

我想通过页面调用模版,呈现照片墙的效果,但不知道这个模版代码如何写,请高手指点参考技术Awordpress是开源的一款博客系统,你可以网上下载wordpress瀑布流主题,然后选择在线安装。便利完全可以达到你自己想要的效果,... 查看详情

flex布局实现瀑布流排版(代码片段)

...布流效果,虽然效果难以达到有些插件的效果,但也算是简单实用吧。如果您还对flex不是太了解,那您需要先了解一下flex布局。实现效果图:& 查看详情

iosuitableview实现的瀑布流效果(代码片段)

这段时间看了一些关于瀑布流的文章。有些是使用UICollectionView实现的有些是使用UItableView实现的。两种方法都试验过,最后还是觉得使用UItableView实现的效果要好一些。工程源码:点击打开链接 https://github.com/zhuming3834/UIT... 查看详情

flutter之瀑布流效果——flutter基础系列(代码片段)

需求:相信android和ios的瀑布流效果大家都试过,网上有很多实现方法和开源库,今天我来为大家介绍一下如何在Flutter中实现瀑布流,整理一下方便以后学习,顺便分享给大家。一、生成二维码1、导入依赖在pu... 查看详情

简单实现加载图片的瀑布流效果

代码很简单,没有注释<styletype="text/css">*{margin:0px;padding:0px;}#container{position:relative;}.box{padding:5px;float:left;}.box_img{padding:5px;border:1pxsolid#CCC;box-shadow:005px#CCC;border-radius:5 查看详情

vue实现网络图片瀑布流+下拉刷新+上拉加载更多(代码片段)

一、思路分析和效果图  用vue来实现一个瀑布流效果,加载网络图片,同时有下拉刷新和上拉加载更多功能效果。然后针对这几个效果的实现,捋下思路:根据加载数据的顺序,依次追加标签展示效果;选择哪种方式实现瀑布... 查看详情

javascript的瀑布流效果的详解及实现(代码片段)

...。2、唯美:图片的风格以唯美的图片为主。3、操作简单:在浏览网站的时候只需要轻轻滑动一下鼠标滚轮,一切的美妙的图片精彩便可呈现在你面前。三、瀑布流的举例百度图片:http://image.baidu.com四、瀑布流的J... 查看详情

浅谈瀑布流(代码片段)

瀑布流又称瀑布流式布局,是比较流行的一种网站页面布局方式。视觉表现为参差不齐的多栏布局,最早采用此布局的是网站是Pinterest,后逐渐在国内流行。瀑布流布局效果即多行等宽元素排列,后面的元素依次添加到其后,等... 查看详情

玩转masonryjs库来实现瀑布流web效果

工作项目中需要制作个Mobile上的WebApp的展示,方便快捷访问和评价反馈。在展示页面能看到应用展示图,点击进入Web应用。我不是前端开发者,对HTML,CSS,JS这三剑客仅仅是略知一二。于是先规划了个简单的设计,感觉瀑布流的图... 查看详情

flutter自适应瀑布流(代码片段)

Flutter自适应瀑布流前言:在电商app经常会看到首页商品推荐的瀑布流,或者类似短视频app首页也是瀑布流,这些都是需要自适应的,才能给用户带来好的体验(具体代码请联系我,当天会回复)话不多... 查看详情

详细分享uicollectionview的自定义布局(瀑布流,线性,圆形...)(代码片段)

前言:本篇文章不是分享collectionView的详细使用教程,而是属于比较‘高级‘的collectionView使用技巧,阅读之前,我想你已经很熟悉collectionView的基本使用,如果不是很熟悉,建议在以后熟悉一下.那么在本篇结束后,你也能够很轻松的使用c... 查看详情

具有分散效果的瀑布流

出现的bug:1、clos=Math.floor($(window).width()/pins.first().outerWidth());由于前面的CSS样式中将float:left注释掉了,并且最开始没有把初始化位置那一部分代码放到最前面,也就是图片没有用absolute定位。img外面用盒子包围,是块级元素,自动... 查看详情

前端jquery实现瀑布流(代码片段)

瀑布流是我们经常会见到的东西,一直刷新一直有,其实它实现起来是很简单的。具体代码如下1、css代码 <style>*margin:0;padding:0;.containerposition:relative;.container.boxfloat:left;padding:15px0015px;.container.box.picborder:1pxsolid 查看详情

flutter最酷炫瀑布流实现(代码片段)

...些组件StaggeredGridView.countBuilder如何实现,难点在哪里瀑布流的宽度与高度。宽度=(屏幕宽—组件间隙)/2高度=图片高度进行设置这样才能实现并展示瀑布流的效果在pubspec.yaml文件添加flutter_staggered_grid_view:^0.4.1flutter_screenut... 查看详情

在鸿蒙中实现类似瀑布流效果

... 鸿蒙OS开发SDK中对于长列表的实现ListContainer的实现较为简单,没法想RecyclerView一样通过使用不同的LayoutManager来实现复杂布局因此没法快速实现瀑布流效果。  但鸿蒙OS也都支持控件的Measure(onEstimateSize),layout(onArrange)和... 查看详情

js实现动态瀑布流及放大切换图片效果(js案例)

...布流以及点击图片放大、上下切换效果。HTML布局写的很简单,图片加载主要是在JS中通过访问自定义的JSON字符串来实现。动态瀑布流的原理简单理解就是把新需要加载的图片放在上一排总高度最小的图片或模块下面,实现参差... 查看详情

android瀑布流照片墙滑动切换图片(代码片段)

...缩小、下载、分享等操作。这些暂时还没有实现。*一、瀑布流照片墙*参考[Android瀑布流照片墙实现,体验不规则排列的美感](http://blog.csdn.net/sziicool/article 查看详情

74.手机端图片瀑布流的加载代码和效果

http://www.bin012.com/index.php?route=product/product&path=63&product_id=52  查看详情