2014-06-22 2 views
1

У меня есть ProgressBar, который имеет максимум 10 000 (не 100). Я хочу, чтобы связанный TextBox показывал процент текущего значения, а не самого значения. Возможно ли это сделать в коде .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 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 и передать в ProgressBarsValue и Maximum

Пример:

Преобразователь

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

Смежные вопросы