【问题标题】:How to calculate percentage value in XAML如何在 XAML 中计算百分比值
【发布时间】:2015-06-15 21:41:19
【问题描述】:

我有圈子Progress-Bar 和这个Circle 里面的简单标签

<DesignInControl:CircularProgressBar x:Name="CircularProgressBar" HorizontalAlignment="Center" VerticalAlignment="Center"
     Percentage="0"  />

<Label Name="lblProgress" Content="0%" Foreground="White"  Grid.Column="1" />

我有 2 个静态字段:

  1. 在我的main form class - totalFiles 中
  2. 作为class member

    公共类数据 { 公共静态 int numberOfFiles; }

所以在这个Circle 和我的label 中,我想通过计算来显示我的百分比:(Data.numberOfFiles\totalFiles) * 100

那么我该如何通过XAML 做到这一点?

编辑

添加包含我的表单变量的新类:

public class TotalPacketInList
{
    private static int _value;

    public static int Value
    {
        get { return _value; }
        set { _value = value; }
    }
}

我的DoubleToPercentageConverter 班级:

public class DoubleToPercentageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return string.Format("{0%}", (int)(((double)Data.numberOfFiles/ TotalFilesInList.Value) * 100));
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return 0;
    }
}

<Label Name="lblCircleProgress" Content="{Binding ElementName=CircularProgressBar,Path=Percentage, Converter={StaticResource DoubleToPercentage}}"
       Grid.Column="1" />

这将计算我的百分比,但是当我尝试运行我的应用程序时,我的label 出现异常:

在 PresentationFramework.dll 中发生了“System.Windows.Markup.XamlParseException”类型的第一次机会异常

附加信息:'设置属性 'System.Windows.Controls.ContentControl.Content' 引发了异常。 行号“481”和行位置“45”。

这是因为当应用程序启动时,TotalPacketInList.Value 的值为零,而我的计算结果除以零。

【问题讨论】:

    标签: wpf


    【解决方案1】:

    您可以使用转换器。为了创建一个转换器:

    1. 创建一个名为“converter”的文件夹并在其中添加一个新类,即:DoubleToPercentageConverter.cs
    2. 这个类必须实现接口IValueConverter。

      public class DoubleToPercentageConverter: IValueConverter
      {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
           //Don't know if the Double cast is neccessary
           return string.Format("{0%}", ((Double)value).ToString()));
        }
      
        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
          throw new NotImplementedException();
        }
      }
      
    3. Convert 方法中添加你的逻辑并返回一个值。例如:

      return value.ToString() + "%";

    4. 在 xaml 中将其添加到您的资源中

      &lt;converter:DoubleToPercentageConverter x:Key="DoubleToPercentage"/&gt;

      converter 是您创建转换器的文件夹

    5. 将转换器绑定到元素:

      &lt;Label Name="lblProgress" Content="{Binding ElementName=CircularProgressBar,Path=Percentage, Converter={StaticResource DoubleToPercentage}}" Foreground="White" Grid.Column="1" /&gt;

    6. 在您的Timer_Tick 事件中,将进度条的Percentage 值设置为您的计算值:

      CircularProgressBar.Percentage = (int)(((double)Data.numberOfFiles/ TotalFilesInList.Value) * 100))
      

    让我知道它是否有效!

    【讨论】:

    • 我需要第 2 节的类示例中的这 2 个方法吗?或者只像你写的那样实现我自己的方法
    • 当你让你的类实现IValueConverter时,你将不得不添加这两个方法。这是因为IValueConverterInterface,您必须实现该接口内的所有方法!为了简化这个过程,在输入 `:IValueConverter` 后,将鼠标悬停在它上面,Visual Studio 会建议你实现缺失的方法! ;) 您可以将ConverBack 留空。
    • 好的,我实现了这个类,在添加到 windows.resources 后我有编译错误:错误 4 找不到类型“转换器:DoubleToPercentageConverter”。确认您没有丢失程序集引用并且所有引用的程序集都已构建
    • 我的 XAML 中有这个:xmlns:my="clr-namespace:MyApp.classes" 但文件夹转换器不在文件夹类中,我应该放在里面吗?
    • 如果您的转换器文件夹位于根文件夹中,请添加 xmlns:converter="clr-namespace:MyApp.converter"
    猜你喜欢
    • 2015-10-11
    • 2019-06-08
    • 2021-04-12
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    相关资源
    最近更新 更多