WPF将TextBlock绑定到具有百分比的ProgressBar

时间:2014-06-22 00:51:46

标签: wpf xaml binding textbox progress-bar

我有一个ProgressBar,最多10,000(不是100)。我希望绑定的TextBox显示当前Value的百分比,而不是Value本身。是否可以在.xaml代码中执行此操作?

以下显示了ProgressBar的当前值。我希望它显示值/最大值。

        <ProgressBar x:Name="calculationProgressBar" />
        <TextBlock x:Name="calculationProgressText" Text="{Binding ElementName=calculationProgressBar, Path=Value, StringFormat={}{0:0}%}" />

2 个答案:

答案 0 :(得分:3)

您可以设置一个简单的IMultiValueConverter并传入ProgressBars ValueMaximum属性

示例:

转换器

public class ValueToPercentConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double value = System.Convert.ToDouble(values[0]);
        double maximum = System.Convert.ToDouble(values[1]);
        return (value / maximum) * 100;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

的Xaml:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="100" Width="100">
    <Window.Resources>
        <local:ValueToPercentConverter x:Key="ValueToPercentConverter" />
    </Window.Resources>
    <StackPanel>
        <ProgressBar x:Name="calculationProgressBar" Maximum="10000" Value="2566" Height="40"/>
        <TextBlock>
            <TextBlock.Text>
                <MultiBinding Converter="{StaticResource ValueToPercentConverter}" StringFormat="{}{0}">
                    <Binding ElementName="calculationProgressBar" Path="Value"/>
                    <Binding ElementName="calculationProgressBar" Path="Maximum"/>
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>
    </StackPanel>
</Window>

结果: enter image description here

答案 1 :(得分:1)

由于在XAML中无法进行操作,因此转换器是一种相同的方法

我尝试为您编写一个简单的代码,使用字符串格式进行百分比通知StringFormat={}{0:P0}

XAML示例

<StackPanel>
    <StackPanel.Resources>
        <l:ScaleConverter x:Key="ScaleConverter"/>
    </StackPanel.Resources>
    <Slider x:Name="calculationSource" Maximum="10000"/>
    <TextBlock Text="{Binding ElementName=calculationSource, 
                              Path=Value, StringFormat={}{0:P0}, 
                              Converter={StaticResource ScaleConverter}, 
                              ConverterParameter=10000}" />
</StackPanel>

我使用滑块代替进度条进行简单演示,您可以使用任何来源

指定转换器参数

中的最大值

和字符串格式的P0表示0精度的百分比格式,例如0%,您可以选择将P1设为1小数,依此类推,例如0.0%

转换器类

class ScaleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return System.Convert.ToDouble(value) / System.Convert.ToDouble(parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

转换器非常简单,将值除以定义的比例。

我希望您发现它对您的问题有用

<强>附加功能

另外,如果您希望在单个位置定义最大范围,则可以将资源用于相同的

<StackPanel>
    <StackPanel.Resources>
        <l:ScaleConverter x:Key="ScaleConverter"/>
        <sys:Double x:Key="maxRange">10000</sys:Double>
    </StackPanel.Resources>
    <Slider x:Name="calculationSource" Maximum="{StaticResource maxRange}"/>
    <TextBlock Text="{Binding ElementName=calculationSource, 
               Path=Value, StringFormat={}{0:P0}, 
               Converter={StaticResource ScaleConverter}, 
               ConverterParameter={StaticResource maxRange}}" />
</StackPanel>