2014-06-22 83 views
1

我有一個最大10,000(不是100)的ProgressBar。我想綁定的文本框顯示當前值的百分比,而不是值本身。是否有可能在.xaml代碼中執行此操作?WPF綁定TextBlock ProgressBar百分比

下面顯示了我的ProgressBar的當前值。我希望它顯示值/最大值。

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

XAML中不執行計算;該功能通過轉換器或屬性綁定執行。 –

回答

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

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> 
3

您可以設置一個簡單的IMultiValueConverter並通過ProgressBarsValueMaximum屬性

實施例:

轉換

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