文章目录

  • 前言
  • 一、如何实现?
    • 1、设置横向ListBox
    • 2、Item设为刻度样式
    • 3、绑定数据源
  • 二、完整代码
  • 三、效果预览
  • 总结

前言

尺子在客户端开发中有一定的应用场景,比如厘米尺、白板的画线尺、视频剪辑的时间尺。一般可以采用用户控件通过自绘的方式实现,但今天我要讲一个不一样的方法,不使用自定义控件也不用用户控件,只需要ListBox即能实现一把尺子。


一、如何实现?

1、设置横向ListBox

我们实现一把水平的尺子,所以需要让ListBox横向显示

<ListBox.ItemsPanel><ItemsPanelTemplate><VirtualizingStackPanel Orientation="Horizontal"></VirtualizingStackPanel></ItemsPanelTemplate>
</ListBox.ItemsPanel>

2、Item设为刻度样式

一个Item就是一个刻度,我们通过ItemTemplate的方式设置样式。

<ListBox.ItemTemplate><DataTemplate><StackPanel Width="10" Height="46" Orientation="Vertical" Background="Transparent"><TextBlock x:Name="text" Margin="0,6,0,6" HorizontalAlignment="Center"  FontSize="16"  Text="{Binding Number}" Foreground="#ffffff"  Visibility="{Binding NumberVisibility}"></TextBlock><Line x:Name="line"  HorizontalAlignment="Center" Height="20" Width="5" X1="2.5" Y1="0" X2="2.5" Y2="25" StrokeThickness="1" Stroke="#aaaaaa"></Line></StackPanel>
</ListBox.ItemTemplate>

3、绑定数据源

由于ListBox是基于数据集合来显示控件的,我们通过绑定数据源让其显示刻度。

<ListBox  ItemsSource="{Binding Chips}">
public class RulerChip
{public double Number { get; set; }public Visibility NumberVisibility { get; set; }}
public List<RulerChip> Chips { get; set; }=new List<RulerChip>();

二、完整代码

MainWindow.xaml

<Window x:Class="WpfApp7.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfApp7"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Grid><ListBox  Background="#333333" Height="50" ItemsSource="{Binding Chips}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ><ListBox.ItemContainerStyle><Style  TargetType="{x:Type ListBoxItem}"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type ListBoxItem}"><ContentPresenterContent="{TemplateBinding Content}"ContentStringFormat="{TemplateBinding ContentStringFormat}"ContentTemplate="{TemplateBinding ContentTemplate}" /></ControlTemplate></Setter.Value></Setter></Style></ListBox.ItemContainerStyle><ListBox.ItemsPanel><ItemsPanelTemplate><VirtualizingStackPanel Orientation="Horizontal"></VirtualizingStackPanel></ItemsPanelTemplate></ListBox.ItemsPanel><ListBox.ItemTemplate><DataTemplate><StackPanel Width="10" Height="46" Orientation="Vertical" Background="Transparent"><TextBlock x:Name="text" Margin="0,6,0,6" HorizontalAlignment="Center"  FontSize="16"  Text="{Binding Number}" Foreground="#ffffff"  Visibility="{Binding NumberVisibility}"></TextBlock><Line x:Name="line"  HorizontalAlignment="Center" Height="20" Width="5" X1="2.5" Y1="0" X2="2.5" Y2="25" StrokeThickness="1" Stroke="#aaaaaa"></Line></StackPanel><DataTemplate.Triggers><DataTrigger Binding="{Binding NumberVisibility}" Value="Hidden"><Setter TargetName="line" Property="Y1" Value="3" /></DataTrigger><Trigger Property="IsMouseOver" Value="True"><Setter TargetName="line" Property="Stroke" Value="RoyalBlue" /><Setter TargetName="text" Property="Foreground" Value="RoyalBlue" /></Trigger></DataTemplate.Triggers></DataTemplate></ListBox.ItemTemplate></ListBox></Grid>
</Window>

MainWindow.xaml.cs

using System.Collections.Generic;
using System.Windows;
namespace WpfApp7
{public class RulerChip{public double Number { get; set; }public Visibility NumberVisibility { get; set; }}/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{public List<RulerChip> Chips { get; set; }=new List<RulerChip>();public MainWindow(){InitializeComponent();DataContext = this;for (int i = 0; i < 100; i++){Chips.Add(new RulerChip() { Number=i/10.0, NumberVisibility = (i%10==0)?Visibility.Visible:Visibility.Hidden});}}}
}

三、效果预览


总结

以上就是今天要讲的内容,本文仅仅简单介绍了ListBox实现尺子控件的方法,很容易实现。而且因为使用了虚拟化容器理论上性能很好,就算是几百万刻度绘制也估计不会卡顿。所以在此基础上可以进行一定的拓展,比如利用dpi实现物理尺子,以及实现时间尺的缩放功能等。总的来说,这是一个易于实现且拓展性也不错的尺子实现方案。

C# wpf 使用ListBox实现尺子控件相关推荐

  1. 编程小问题系列(2)——为什么WPF里MediaElement等视频控件不起作用

    为什么WPF里MediaElement等视频控件不起作用? 非常可能的原因是因为没有安装Microsoft Windows Media Player 10或者10以上的播放器,MSDN文档里 就写有下 ...

  2. WPF不同线程之间的控件的访问

    WPF不同线程之间的控件是不同访问的,为了能够访问其他线程之间的控件,需要用Dispatcher.Invoke执行一个新的活动即可. 例如: public void SetNotes(string n ...

  3. WPF 实现 DataGrid/ListView 分页控件

    原文:WPF 实现 DataGrid/ListView 分页控件 在WPF中,通常会选用DataGrid/ListView进行数据展示,如果数据量不多,可以直接一个页面显示出来.如果数据量很大,200 ...

  4. WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit)

    原文 WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit) Windows Community Toolkit 再次更新到 5.0. ...

  5. 【C#】wpf自定义calendar日期选择控件的样式

    原文:[C#]wpf自定义calendar日期选择控件的样式 首先上图看下样式 原理 总览 ItemsControl内容的生成 实现 界面的实现 后台ViewModel的实现 首先上图,看下样式 原理 ...

  6. WPF自定义LED风格数字显示控件

    WPF自定义LED风格数字显示控件 原文:WPF自定义LED风格数字显示控件 版权声明:本文为博主原创文章,转载请注明作者和出处 https://blog.csdn.net/ZZZWWWPPP1119 ...

  7. WPF实现炫酷Loading控件

    原文: WPF实现炫酷Loading控件 Win8系统的Loading效果还是很不错的,网上也有人用CSS3等技术实现,研究了一下,并打算用WPF自定义一个Loading控件实现类似的效果,并可以让用 ...

  8. C#窗体应用程序之CheckListBox复选列表与ListBox列表框控件

    1.CheckListBox复选列表 复选框功能类似的复选列表框 (CheckedListBox),方便用户设置和获取复选列表框中的选项,复选列表框显示的效果与复选框类似,但在选择多个选项时操作比一般 ...

  9. 【小沐学C#】WPF中嵌入web网页控件(WebBrowser、WebView2、CefSharp)

    文章目录 1.简介 1.1 WPF简介 1.2 WPF 体系结构 1.3 WPF入门开发 2.WebBrowser 2.1 WebBrowser特点 2.2 WebBrowser常用的属性.方法和事件 ...

最新文章

  1. 十种MySQL报错注入
  2. ways to talk with girls
  3. 汇编解析(3)-nasm基础、物理地址
  4. 全量复制 增量复制 异步复制
  5. python自定义安装哪些不需要_【1】python模块:自定义模块的3种导入方式
  6. 白宫任命退伍将军担任首位联邦首席信息安全官
  7. 怎样追求一个你喜欢的人?
  8. 【tips】编译epic异常解决
  9. 用U盘打开XP登入码
  10. (一)跟我一起玩Linux网络服务:DNS服务——BIND(/etc/named.conf、/var/named)设置实现和解释...
  11. 网络安全之Bot学习笔记
  12. 常用的远程连接Linux工具有哪些??
  13. dbc2000 v2.0官方版
  14. RFID中的天线技术-应用及设计现状
  15. 群晖第三方套件中心地址
  16. 微信怎么彻底删除微信消息?
  17. 用SNMP协议实现系统监控
  18. parameter缩略语_通信缩略语和术语
  19. 专升本 计算机 公共课学习笔记(持续更新中...)
  20. jarvisoj_level0

热门文章

  1. CAN301 移动计算 个人笔记
  2. matlab车牌识别的外文文献翻译,汽车车牌识别系统(带外文翻译).doc
  3. 多边形游戏-动态规划(Java)
  4. 坐标轴删了怎么恢复_cad中坐标标注恢复xy轴的方法
  5. mysql 提现_第四站——网贷平台数据分析(MySQL篇)
  6. 中国象棋软件-引擎实现(二)棋局表示
  7. 某IDC数据中心智能布线系统案例简析
  8. 利用.pbk来实现ADSL开机自动拨号
  9. java基于ssm,jsp开发的卖鞋商城鞋店系统
  10. 接上篇——生成单词索引表