2018-8-10-win10-uwp-进度条-Marquez-
原文:2018-8-10-win10-uwp-进度条-Marquez-
| title | author | date | CreateTime | categories |
|---|---|---|---|---|
|
win10 uwp 进度条 Marquez
|
lindexi
|
2018-08-10 19:16:51 +0800
|
2018-2-13 17:23:3 +0800
|
Win10 UWP
|
本文将告诉大家,如何做一个带文字的进度条,这个进度条可以用在游戏,现在我做的挂机游戏就使用了他。
如何做上图的效果,实际需要的是两个控件,一个是显示文字 的 TextBlock 一个是进度条。
那么如何让 文字和左边的距离变化?使用 TranslateTransform
看起来 Marquez 的界面就是:
<ProgressBar x:Name="Mcdon" Maximum="100" Minimum="0" Value="20"
VerticalAlignment="Stretch"></ProgressBar>
<TextBlock x:Name="scrohn" Text="100/100"
VerticalAlignment="Center">
<TextBlock.RenderTransform>
<TranslateTransform X="0"></TranslateTransform>
</TextBlock.RenderTransform>
</TextBlock>
进度条的名字就是 Marquez ,写完界面,后台也不难
需要使用几个依赖属性设置最大值、当前值、最小值
/// <summary>
/// 标识 <see cref="Maximum" /> 的依赖项属性。
/// </summary>
public static readonly DependencyProperty MaximumProperty = DependencyProperty.Register(
"Maximum", typeof(double), typeof(Marquez), new PropertyMetadata(100d, (s, e) =>
{
var t = s as Marquez;
if (t == null)
{
return;
}
Scrhrentran(t.scrohn, t.ActualWidth, t.Value, (double) e.NewValue, t.Mcdon);
}));
/// <summary>
/// 标识 <see cref="Minimum" /> 的依赖项属性。
/// </summary>
public static readonly DependencyProperty MinimumProperty = DependencyProperty.Register(
"Minimum", typeof(double), typeof(Marquez), new PropertyMetadata(default(double)));
/// <summary>
/// 标识 <see cref="Value" /> 的依赖项属性。
/// </summary>
public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
"Value", typeof(double), typeof(Marquez), new PropertyMetadata(20d, (s, e) =>
{
var t = s as Marquez;
if (t == null)
{
return;
}
Scrhrentran(t.scrohn, t.ActualWidth, (double) e.NewValue, t.Maximum, t.Mcdon);
}));
/// <summary>
/// 获取或设置
/// </summary>
public double Value
{
get { return (double) GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
/// <summary>
/// 获取或设置最小值
/// </summary>
public double Minimum
{
get { return (double) GetValue(MinimumProperty); }
set { SetValue(MinimumProperty, value); }
}
/// <summary>
/// 获取或设置最大值
/// </summary>
public double Maximum
{
get { return (double) GetValue(MaximumProperty); }
set { SetValue(MaximumProperty, value); }
}
所有值变化时,需要修改文字和进度条,因为进度条没有绑定值到代码,Scrhrentran 函数修改所有值。
为什么不使用绑定,因为绑定容易重复,而且有些值不是简单绑定就可以,这个控件使用绑定还是可以做到,如果自己感兴趣,可以修改他绑定。
从属性可以看到,值变化自动调用 Scrhrentran 于是函数需要修改进度条的值,修改进度条很简单,只需要使用下面代码
private static void Scrhrentran(TextBlock scrohn, double w, double v, double t, ProgressBar mcdon)
{
mcdon.Value = v;
mcdon.Maximum = t;
}
可以看到,上面的代码没修改最小值,因为最小值没有在依赖属性写,我不写最小值因为我想讲下如何获得依赖属性修改。
依赖属性是很好用的,他自己就带了绑定,如果想用绑定,那么可以使用依赖属性,依赖属性可以使用 dep 和tab打出来,一般的依赖属性是比较长的,最小值用的就是 vs 自带的依赖属性,也就是经常这样写。
/// <summary>
/// 标识 Minimum 的依赖项属性。
/// </summary>
public static readonly DependencyProperty MinimumProperty = DependencyProperty.Register(
"Minimum", typeof(double), typeof(Marquez), new PropertyMetadata(default(double))); /// <summary>
/// 获取或设置最小值
/// </summary>
public double Minimum
{
get { return (double) GetValue(MinimumProperty); }
set { SetValue(MinimumProperty, value); }
}
实际依赖属性是上面的静态属性,他使用了注册,注册的第一个参数表示变量的名字,因为是自己生成的,就是字符串,但是字符串有问题,如果我修改了 Minimum 名称,那么字符串就无法使用,为了在修改名称可以使用,我建议使用 nameof 这个可以获得变量名称。
其中第二个参数是 类型,第三个是类,这个参数指定是哪个类,如果复制了别人的 依赖属性,容易出错,因为他的类没有修改为自己的类。最后一个属性是指定默认值,在这个属性可以指定属性修改时的函数。
public static readonly DependencyProperty MinimumProperty = DependencyProperty.Register(
"Minimum", typeof(double), typeof(Marquez), new PropertyMetadata(default(double), (s, e) =>
{ } ));
现在就可以在里面写属性修改的函数,第一个参数 s 是哪个触发,也就是 Marquez ,使用第一个参数就可以获得 Marquez,第二个参数是获得之前的值和当前的值,通过e.NewValue可以获得修改后的值。
但是不可以通过这个函数修改 e.NewValue 的值。
于是这个控件比较难的地方就是修改文字,下面来开始做这部分。
显示文字可以使用下面代码
scrohn.Text = v.ToString("F") + "/" + t.ToString("F");
可以看到,只看代码是不知道 v 是什么, t 是什么,所以在命名时最好不要这样写,建议写为 value 和 maximum,这样看代码就可以知道两个值。
修改文字之前,判断RenderTransform
var sc = scrohn.RenderTransform as TranslateTransform;
在value为最大值,文字显示在中间,于是文字最大的就是 w / 2 ,w就是控件宽度。但是还需要乘以现在的 v / t
于是算法就是 sc.X = w / 2 * v / t ,但是因为文字有宽度,显示的是文字左边,所以需要减去文字,但是可能让文字在控件看不到,因为sc.X < 0,于是代码就是
sc.X = w / 2 * v / t - scrohn.ActualWidth / 2;
if (sc.X < 0)
{
sc.X = 0;
}
总的代码放在github:https://github.com/lindexi/UWP/tree/master/uwp/control/Progress
如果 想写一个控件,建议先在我的库找找,可能我做了,所以可以让你省点时间。
2018-8-10-win10-uwp-进度条-Marquez-的更多相关文章
- win10 uwp 进度条 Marquez
本文将告诉大家,如何做一个带文字的进度条,这个进度条可以用在游戏,现在我做的挂机游戏就使用了他. 如何做上图的效果,实际需要的是两个控件,一个是显示文字 的 TextBlock 一个是进度条. 那么如 ...
- win10 uwp 进度条 WaveProgressControl
昨天看到了有个大神做出好看的进度条样式,于是我就去抄袭他的代码,但是发现看不懂,于是本文主要翻译就是大神说这个控件如何做. 本文翻译 https://stackoverflow.com/a/46057 ...
- 10款CSS3进度条Loading动画
在线演示 本地下载
- win10 uwp 渲染原理 DirectComposition 渲染
本文来告诉大家一个新的技术DirectComposition,在 win7 之后(实际上是 vista),微软正在考虑一个新的渲染机制 在 Windows Vista 就引入了一个服务,桌面窗口管理器 ...
- Google Chrome 圆形进度条
Conmajia © 2012 Updated on Feb. 21, 2018 Google Chrome 的圆形进度条. Demo 功能 显示百分比(0-100).如果进度值达到 100%,则将闪 ...
- css3 进度条
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>1 ...
- 怎样控制界面控件之进度条(ProgressBar)功能
一.基础知识: 1.ProgressBar在界面文件XML中的布局: [html] <progressBar android:id="@+id/progressbar_updown&q ...
- 03 ProgressBar 进度条
> style="?android:attr/progressBarStyleSmall" 样式 android:progress= ...
- Unity3D手游开发日记(3) - 场景加载进度条的完美方案
我以为做个进度条很简单,分分钟解决,结果折腾了一天才搞定,Unity有很多坑,要做完美需要逐一解决. 问题1:最简单的方法不能实现100%的进度 用最简单的方法来实现,不能实现100%的进度,原因是U ...
随机推荐
- 【转载】algorithm、numeric、functional
reference url:http://www.cplusplus.com/reference/algorithm reference url:https://blog.csdn.net/Swust ...
- Python实战——基于股票的金融数据量化分析
说明:本文只是通过自己的已学知识对股票数据进行了一个简单的量化分析,只考虑了收盘情况,真实的量化交易中仅仅考虑收盘情况是不够的,还有很多的复杂因素,而且仅仅三年数据是不足以来指导真实的股票交易的,因此 ...
- 硬盘容量统计神器WinDirStat
最近遇到C盘快要爆满的问题,我的笔记本是128G SSD + 1t HDD,给C盘分配的空间是80G固态,由于平时疏远管理,造成了C盘臃肿,迁移一些软件,但还是没有太好的解决,这是上知乎发现有大神推荐 ...
- JPA的entityManager的find方法与getReference方法的区别
场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...
- 使用NodeJS模块-NodeJS官方提供的核心模块
除了使用自己写的本地模块以外,NodeJS可以使用另外两种类型的模块,分别是NodeJS官方提供的核心模块和第三方提供的模块 NodeJS官方提供的核心模块 NodeJS平台自带的一套基本的功能模块, ...
- 使用npm link 加速调试
我们在把包发布到npm上时,如果需要对本地的包进行修改,我们需要改变一个版本,重新发布.然后测试时需要更新这个包进行测试.这样的话,每一次的调试都特别麻烦.我们可以使用npm link来加速这个调试过 ...
- 【转】java中使用WebSocket
传统的请求,都是从客服端到服务端,表现在web应用上就是,消息都只能由浏览器发起请求,调用客户端的方法. webSocket可以从服务器端推送消息给浏览器. 使用场景: 当客户端发起缴费请求时,由服务 ...
- frp内网渗透实现ssh外网访问家里树莓派(树莓派raspbian系统+腾讯云contos7)
只有信用卡大小的它,同时也是一台功能完备的电脑(树莓派),把内网能玩的功能都玩了个遍,自然就有了外网访问这台树莓派的需求.一样也是查阅了无数文章,研究了无数个方案,最终试验成功用FRP实现了内网穿透, ...
- read write方式打开PHYSICAL STANDBY,闪回和还原测试
以下大部分都在STANDBY执行,主库执行(两次)的会提示 [STANDBY read write方式打开测试]检查standby状态SQL> SELECT NAME,DATABASE_ROLE ...
- 如何判断Linux系统安装在VMware上?
如何判断当前Linux系统是否安装在VMware上面呢? 因为公司大部分服务器位于VMware上,也有小部分系统部署在物理机上面.今天老大要求统计一下VMware和物理机上服务器的数量,个人简单测试. ...