如何获取进度条的当前值的位置

时间:2017-01-19 18:33:40

标签: c# wpf xaml

我有一个WPF项目,我在ListBox中使用ProgressBars来显示一系列值。我想在位于进度条正上方的文本框中显示数值。如何获取每个进度条的值的位置,以便我可以放置一个TextBox? 这是ProgressBar xaml:

<ProgressBar Orientation="Vertical" 
                          Width="78"
                          BorderThickness="0"
                          Minimum="{Binding minTest}"
                          Maximum="{Binding maxTest}"
                          Value="{Binding valTest}"
                          Background="Transparent"
                          Foreground="{Binding bar_color}"/>

2 个答案:

答案 0 :(得分:2)

有几种方法可以做到这一点。一个可能是:

    <Window x:Class="SO41749207.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:SO41749207"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
  <Window.Resources>
    <Style TargetType="ListBoxItem">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="ListBoxItem">
            <StackPanel Orientation="Vertical">
              <TextBox Text="{Binding ElementName=MyProgress, Path=Value}" />
              <ProgressBar Name="MyProgress" Value="50" />
            </StackPanel>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </Window.Resources>
  <Grid>
    <ListBox>
      <ListBoxItem>a</ListBoxItem>
      <ListBoxItem>b</ListBoxItem>
      <ListBoxItem>c</ListBoxItem>
    </ListBox>
  </Grid>
</Window>

更类似MVVM的方法是为列表项定义视图模型:

  public class MyListItem : INotifyPropertyChanged
  {

    double m_progressValue = 0.0;
    public double ProgressValue
    {
      get { return m_progressValue; }
      set
      {
        m_progressValue = value;
        OnPropertyChanged("ProgressValue");
      }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string property)
    {
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
    }
  }

...和相应的DataTemplate:

<DataTemplate DataType="{x:Type models:MyListItem}">
  <StackPanel Orientation="Vertical">
    <TextBox Text="{Binding ProgressValue}" HorizontalAlignment="Center" Width="50" TextAlignment="Center" />
    <ProgressBar Value="{Binding ProgressValue}" />
  </StackPanel>
</DataTemplate>

...对于列表项:

<ListBox HorizontalContentAlignment="Stretch">
  <ListBox.ItemsSource>
    <cols:ArrayList>
      <models:MyListItem ProgressValue="10" />
      <models:MyListItem ProgressValue="50" />
      <models:MyListItem ProgressValue="80" />
    </cols:ArrayList>
  </ListBox.ItemsSource>
</ListBox>

答案 1 :(得分:0)

由于您已将ProgressBar值绑定到viewmodel:

<ProgressBar Orientation="Vertical" 
                      Width="78"
                      BorderThickness="0"
                      Minimum="{Binding minTest}"
                      Maximum="{Binding maxTest}"
                      Value="{Binding valTest}"
                      Background="Transparent"
                      Foreground="{Binding bar_color}"/>

为什么不将TextBox绑定到相同的值?

<TextBox Text="{Binding valTest}" />