如何将 ProgressBar Maximum minus Value 绑定到 WPF 中的文本块
How to bind ProgressBar Maximum minus Value to textblock in WPF
在 Expression blend 中,我有一个进度条和两个文本块。我将第一个文本块绑定到值 属性 。我需要将第二个文本块绑定到 Maximum-Value 属性以读取剩余的数量来填充进度条。我怎样才能在 XAML 中做到这一点?
因为我想在修改 progressBar 值的同时在设计器视图中看到变化
视图如下:
https://i.imgur.com/yTF1rRl.png
代码:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="mobSizing.MainWindow"
x:Name="Window"
Title="MainWindow"
Width="640" Height="480">
<Grid x:Name="LayoutRoot">
<ProgressBar x:Name="progressBar" Height="41" Margin="84,77,125,0" VerticalAlignment="Top" Value="66"/>
<TextBlock x:Name="Value" HorizontalAlignment="Left" Height="40" Margin="106,142,0,0" TextWrapping="Wrap" Text="{Binding Value, ElementName=progressBar}" VerticalAlignment="Top" Width="182" Foreground="#FF40B617"/>
<TextBlock x:Name="Left" HorizontalAlignment="Right" Height="40" Margin="0,145,53,0" TextWrapping="Wrap" Text="{Binding Value, ElementName=progressBar}" VerticalAlignment="Top" Width="182" Foreground="#FF8F8F8F"/>
</Grid>
</Window>
这是一种基于多转换器的方法。
标记:
<Grid x:Name="LayoutRoot">
<Grid.RowDefinitions>
<RowDefinition Height="60"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ProgressBar x:Name="progressBar" Height="41"
Grid.ColumnSpan="3"
Value="66"/>
<TextBlock x:Name="Value"
Grid.Column="0"
Grid.Row="1"
Text="{Binding Value, ElementName=progressBar}" VerticalAlignment="Top"
TextAlignment="Center"
Foreground="#FF40B617"/>
<TextBlock x:Name="Left"
Grid.Column="2"
Grid.Row="1"
TextAlignment="Center"
VerticalAlignment="Top"
Foreground="#FF8F8F8F">
<TextBlock.Text>
<MultiBinding Converter="{local:AmountLeftMultiConverter}" StringFormat="{}{0:n0}">
<Binding Path="Maximum" ElementName="progressBar"/>
<Binding Path="Value" ElementName="progressBar"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</Grid>
转换器将从第一个绑定中减去第二个绑定提供的任何内容。这些值以数组的形式传递给多转换器。
转换器。我的在临时应用程序中,因此您的命名空间会有所不同:
using System;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Markup;
namespace wpf_99
{
public class AmountLeftMultiConverter : MarkupExtension, IMultiValueConverter
{
public double Multiplier { get; set; }
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
double toAdd = System.Convert.ToDouble(values[0]);
double toSubtract = System.Convert.ToDouble(values[1]);
return toAdd - toSubtract;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
}
}
因为这也是一个markupextension,所以在使用之前不需要在任何资源中声明它。
在 Expression blend 中,我有一个进度条和两个文本块。我将第一个文本块绑定到值 属性 。我需要将第二个文本块绑定到 Maximum-Value 属性以读取剩余的数量来填充进度条。我怎样才能在 XAML 中做到这一点?
因为我想在修改 progressBar 值的同时在设计器视图中看到变化
视图如下: https://i.imgur.com/yTF1rRl.png
代码:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="mobSizing.MainWindow"
x:Name="Window"
Title="MainWindow"
Width="640" Height="480">
<Grid x:Name="LayoutRoot">
<ProgressBar x:Name="progressBar" Height="41" Margin="84,77,125,0" VerticalAlignment="Top" Value="66"/>
<TextBlock x:Name="Value" HorizontalAlignment="Left" Height="40" Margin="106,142,0,0" TextWrapping="Wrap" Text="{Binding Value, ElementName=progressBar}" VerticalAlignment="Top" Width="182" Foreground="#FF40B617"/>
<TextBlock x:Name="Left" HorizontalAlignment="Right" Height="40" Margin="0,145,53,0" TextWrapping="Wrap" Text="{Binding Value, ElementName=progressBar}" VerticalAlignment="Top" Width="182" Foreground="#FF8F8F8F"/>
</Grid>
</Window>
这是一种基于多转换器的方法。
标记:
<Grid x:Name="LayoutRoot">
<Grid.RowDefinitions>
<RowDefinition Height="60"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ProgressBar x:Name="progressBar" Height="41"
Grid.ColumnSpan="3"
Value="66"/>
<TextBlock x:Name="Value"
Grid.Column="0"
Grid.Row="1"
Text="{Binding Value, ElementName=progressBar}" VerticalAlignment="Top"
TextAlignment="Center"
Foreground="#FF40B617"/>
<TextBlock x:Name="Left"
Grid.Column="2"
Grid.Row="1"
TextAlignment="Center"
VerticalAlignment="Top"
Foreground="#FF8F8F8F">
<TextBlock.Text>
<MultiBinding Converter="{local:AmountLeftMultiConverter}" StringFormat="{}{0:n0}">
<Binding Path="Maximum" ElementName="progressBar"/>
<Binding Path="Value" ElementName="progressBar"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</Grid>
转换器将从第一个绑定中减去第二个绑定提供的任何内容。这些值以数组的形式传递给多转换器。
转换器。我的在临时应用程序中,因此您的命名空间会有所不同:
using System;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Markup;
namespace wpf_99
{
public class AmountLeftMultiConverter : MarkupExtension, IMultiValueConverter
{
public double Multiplier { get; set; }
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
double toAdd = System.Convert.ToDouble(values[0]);
double toSubtract = System.Convert.ToDouble(values[1]);
return toAdd - toSubtract;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
}
}
因为这也是一个markupextension,所以在使用之前不需要在任何资源中声明它。