国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

android 中win10 使用uwp控件實現進度條Marquez效果

2019-12-12 02:40:23
字體:
來源:轉載
供稿:網友

本文將告訴大家,如何做一個帶文字的進度條,這個進度條可以用在游戲,現在我做的掛機游戲就使用了他。

如何做上圖的效果,實際需要的是兩個控件,一個是顯示文字 的 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

以上所述是小編給大家介紹的android 中win10 使用uwp控件實現進度條Marquez效果,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 通山县| 安溪县| 义乌市| 日喀则市| 会泽县| 泌阳县| 盐山县| 滨海县| 北川| 嵊州市| 黑河市| 玛沁县| 黔东| 安化县| 藁城市| 饶平县| 大丰市| 五华县| 平遥县| 兰溪市| 锦屏县| 乐平市| 芦山县| 万山特区| 吉木萨尔县| 甘谷县| 伊金霍洛旗| 平乐县| 津市市| 阜宁县| 湖州市| 汝州市| 肥东县| 永和县| 册亨县| 九台市| 房产| 峨眉山市| 库车县| 神木县| 峨眉山市|