原文:WPf 带滚动条WrapPanel 自动换行 和控件右键菜单

技能点包括 WPf 样式的引用 数据的验证和绑定 比较适合初学者

前台:


  1. <Window.Resources>
  2. <local:PathToSource x:Key="n2"/>
  3. <Style x:Key="{x:Type ContextMenu}" TargetType="{x:Type ContextMenu}">
  4. <Setter Property="OverridesDefaultStyle" Value="True"/>
  5. <Setter Property="SnapsToDevicePixels" Value="True"/>
  6. <Setter Property="Template">
  7. <Setter.Value>
  8. <ControlTemplate TargetType="{x:Type ContextMenu}">
  9. <Border Background="#CD222120" CornerRadius="7, 7, 8, 8" BorderBrush="DarkGray" BorderThickness="2" Opacity="0.96">
  10. <StackPanel ClipToBounds="True" Orientation="Vertical" IsItemsHost="True" Margin="5,4,5,4"/>
  11. </Border>
  12. </ControlTemplate>
  13. </Setter.Value>
  14. </Setter>
  15. </Style>
  16. <ControlTemplate x:Key="{x:Static MenuItem.TopLevelItemTemplateKey}" TargetType="{x:Type MenuItem}">
  17. <Border Name="Border" >
  18. <Grid>
  19. <ContentPresenter Margin="6,3,6,3" ContentSource="Header" RecognizesAccessKey="True" />
  20. </Grid>
  21. </Border>
  22. </ControlTemplate>
  23. <DataTemplate x:Key="Wrapitem">
  24. <Grid Height="86" Width="86" >
  25. <Grid.ContextMenu>
  26. <ContextMenu Name="cm" StaysOpen="true">
  27. <MenuItem Header="update"/>
  28. <MenuItem Header="Save"/>
  29. <MenuItem Header="SaveAs"/>
  30. </ContextMenu>
  31. </Grid.ContextMenu>
  32. <Image Margin="8,8,8,24" Source="{Binding Path=Url,Converter={StaticResource n2}}"/>
  33. <Label Content="{Binding Path=Text}" Height="22" Width="45" VerticalAlignment="Bottom"/>
  34. </Grid>
  35. </DataTemplate>
  36. </Window.Resources>
  37. <Grid>
  38. <ListBox x:Name="list" Margin="124,63,109,44" ScrollViewer.HorizontalScrollBarVisibility="Hidden" ItemTemplate="{StaticResource Wrapitem}">
  39. <ListBox.Resources>
  40. <Style TargetType="ListBoxItem">
  41. <Style.Resources>
  42. <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#FFA1A1A1"/>
  43. </Style.Resources>
  44. </Style>
  45. </ListBox.Resources>
  46. <!--<ListBox.ItemsPanel >
  47. <ItemsPanelTemplate>
  48. <WrapPanel Orientation="Horizontal" IsItemsHost="True"/>
  49. </ItemsPanelTemplate>
  50. </ListBox.ItemsPanel>-->
  51. <ListBox.Template>
  52. <ControlTemplate TargetType="{x:Type ListBox}">
  53. <ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
  54. <WrapPanel Orientation="Horizontal" IsItemsHost="True" ScrollViewer.CanContentScroll="True"/>
  55. </ScrollViewer>
  56. </ControlTemplate>
  57. </ListBox.Template>
  58. </ListBox>
  59. </Grid>
  60. </Window>

后台:


  1. /// <summary>
  2. /// MainWindow.xaml 的交互逻辑
  3. /// </summary>
  4. public partial class MainWindow : Window
  5. {
  6. public MainWindow()
  7. {
  8. InitializeComponent();
  9. load();
  10. }
  11. public void load()
  12. {
  13. ObservableCollection<Mean> ListMean = new ObservableCollection<Mean>()
  14. {
  15. new Mean(){Text="001",Url="i"},
  16. new Mean(){Text="002",Url="i"},
  17. new Mean(){Text="003",Url="ii"},
  18. new Mean(){Text="004",Url="i"},
  19. new Mean(){Text="005",Url="i"},
  20. new Mean(){Text="006",Url="ii"},
  21. new Mean(){Text="007",Url="i"},
  22. new Mean(){Text="008",Url="i"},
  23. new Mean(){Text="009",Url="i"},
  24. new Mean(){Text="010",Url="i"},
  25. new Mean(){Text="011",Url="ii"},
  26. new Mean(){Text="012",Url="i"},
  27. new Mean(){Text="013",Url="i"},
  28. new Mean(){Text="014",Url="i"},
  29. new Mean(){Text="015",Url="i"},
  30. new Mean(){Text="016",Url="i"},
  31. new Mean(){Text="017",Url="i"}
  32. };
  33. list.ItemsSource = ListMean;
  34. }
  35. }
  36. public class Mean : INotifyPropertyChanged
  37. {
  38. private string text;
  39. public string Text
  40. {
  41. get { return text; }
  42. set { text = value; OnPropertyChanged("Text"); }
  43. }
  44. private string url;
  45. public string Url
  46. {
  47. get { return url; }
  48. set { url = value; OnPropertyChanged("Url"); }
  49. }
  50. public event PropertyChangedEventHandler PropertyChanged;
  51. public void OnPropertyChanged(string propertyName)
  52. {
  53. if (PropertyChanged != null)
  54. {
  55. PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  56. }
  57. }
  58. }
  59. public class PathToSource:IValueConverter
  60. {
  61. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  62. {
  63. string url = string.Format(@"/Images/{0}.jpg", (string)value=="i"?"i":"ii");
  64. return new BitmapImage(new Uri(url,UriKind.Relative));
  65. }
  66. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  67. {
  68. throw new NotImplementedException();
  69. }
  70. }

WPf 带滚动条WrapPanel 自动换行 和控件右键菜单的更多相关文章

  1. MFC小型工具通用界面框架CLIST控件+右键菜单功能

    MFC-小型工具通用界面框架 0x1 场景 由于工作需要我会写代码开发工具给客户或者同事用.代码都能实现,但写个黑乎乎的命令行工具给别人用确实显得不够专业,用别人写好的成型工具又担心有后门. 所以掌握 ...

  2. FineUI Grid控件右键菜单的实现

    FineUI官方Demo上一直没有Grid右键菜单的实现,其实从4.1.x的版本开始,允许添加自定义的事件监听(Listeners),所以要实现这个功能已经相当容易了. ExtJs右键菜单有很多种,对 ...

  3. win32 listctrl控件右键菜单的实现

    HMENU Menu_list,Menu_all; POINT point; HINSTANCE hInstance;//下面代码放到BOOL WINAPI DialogProc下 case WM_C ...

  4. WPF中不规则窗体与WebBrowser控件的兼容问题解决办法

    原文:WPF中不规则窗体与WebBrowser控件的兼容问题解决办法 引言 这几天受委托开发一个网络电视项目,要求初步先使用内嵌网页形式实现视频播放和选单,以后再考虑将网页中的所有功能整合进桌面程序. ...

  5. WPF自定义控件(五)の用户控件(完结)

    用户控件,WPF中是继承自UserControl的控件,我们可以在里面融合我们的业务逻辑. 示例:(一个厌恶选择的用户控件) 后端: using iMicClassBase; using iMicCl ...

  6. Git使用总结 Asp.net生命周期与Http协议 托管代码与非托管代码的区别 通过IEnumerable接口遍历数据 依赖注入与控制反转 C#多线程——优先级 AutoFac容器初步 C#特性详解 C#特性详解 WPF 可触摸移动的ScrollViewer控件 .NET(C#)能开发出什么样的APP?盘点那些通过Smobiler开发的移动应用

    一,原理 首先,我们要明白Git是什么,它是一个管理工具或软件,用来管理什么的呢?当然是在软件开发过程中管理软件或者文件的不同版本的工具,一些作家也可以用这个管理自己创作的文本文件,由Linus开发的 ...

  7. 封装:WPF中可以绑定的BindPassWord控件

    原文:封装:WPF中可以绑定的BindPassWord控件 一.目的:本身自带的PassWord不支持绑定 二.Xaml部分 <UserControl x:Class="HeBianG ...

  8. WPF布局之让你的控件随着窗口等比放大缩小,适应多分辨率满屏填充应用

    一直以来,我们设计windows应用程序,都是将控件的尺寸定好,无论窗体大小怎么变,都不会改变,这样的设计对于一般的应用程序来说是没有问题的,但是对于一些比较特殊的应用,比如有背景图片的,需要铺面整个 ...

  9. WPF自定义控件与样式(9)-树控件TreeView与菜单Menu-ContextMenu

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: 菜单M ...

随机推荐

  1. java 网站源码 在线编辑模版 代码编辑器 兼容手机平板PC freemaker 静态引擎

    前台: 支持四套模版, 可以在后台切换   系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成html 2.因为是生成的html,所以 ...

  2. Class文件结构-属性表

    一.属性表整体结构 二.属性表具体结构

  3. 关于js的for in循环,慎用

    参考:http://www.cftea.com/c/2014/08/6290.asp作者:vkvi 如题我看到也有点诧异,测试了真的有这个问题,上代码 Array.prototype.a = func ...

  4. C++ --内存四区概述

    内存四区 代码区:存放函数体第二进制代码,由操作戏台进行管理 数据区:存放全局变量和静态变量以及常量 栈区:由编译器自动分配释放,存放函数的参数值,局部变量等 堆区:由程序员分配和释放,若程序员不是放 ...

  5. TP打印输出SQL语句

    模型 -> getLastSql(); //TP打印SQL语句 $data = $this->field($field)->where($condition)->select( ...

  6. [MySQL] 使用force index强制使用索引

    1.在测试一个按照时间的范围查询时,尽管增加了索引,发现使用不到索引,可以使用这个来强制使用索引 测试过程为,创建下面的表,以及创建了联合索引 create table delay_delete_us ...

  7. Liu Junqiao:工作中用到的命令以及问题汇总

    工作中用到的命令以及问题汇总 2019-11-29 查看系统运行时间,这个问题是因为我们在阿里云上有个机器,在某一天发现这台机器上有的服务莫名奇妙的停了,然后排查时怀疑机器被重启过用如下如下命令查看了 ...

  8. 剑指Offer-39.把数组排成最小的数(C++/Java)

    题目: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 分析: 将数组 ...

  9. react 项目引入路由

    下载路由包 npm i react-router-dom -d 前台路由 登陆: /login /login.jsx App.js import React ,{Component} from 're ...

  10. react+ant-mobile+lib-flexible构建移动端项目适应设计图尺寸(750)

    使用lib-flexible在react中先安装 npm install lib-flexible --save 因为插件使用的是rem适配,所以安装两个插件 npm install postcss- ...