2011-11-23 69 views
0

我想通过代码(VB.Net)在网格或表格内创建多个进度条。结构布局如下:在网格内以编程方式创建多个进度条

Game 1  [ Progress Bar 1 ] 
      Downloading 2MB of 4MB 

Game 2  [ Progress Bar 2 ] 
      Downloading 4MB of 5MB 

Game 3  [ Progress Bar 3 ] 
      Download completed 

需要能够实时更新所选进度条的值。 我应该创建一个新的类,并在这个类中添加一个进度条数组?


编辑:

说我合并的答案,建议使用ItemsControl中显示我的组的进度条的show_progress_page(UI)内。我有另一个download_page实际上使用WebClient DownloadFileAsync来下载所有的游戏。

我应该如何将download_page中的功能放在show_progress_page里面来创建进度条?

我试图创建该类download_page但它加载之后的UI不显示这个新的进度条

Public Class download_page 
Public CollectionDownloads As New ObservableCollection(Of [DownloadAppViewModel])() 

Public Sub New() 
    InitializeComponent() 
    Dim individualDownload As New DownloadAppViewModel() 
    individualDownload.GameName = "hello" 
    individualDownload.TotalSize = 20 
    individualDownload.DownloadedSize = 5 
    CollectionDownloads.Add(individualDownload) 
End Sub 

End Class 
+0

[您的绑定是否正确](http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30/debugging-data-bindings-in-a-wpf-or-silverlight-application。 ASPX)? –

回答

2

非常容易使用MVVM pattern;)

创建类来表示每个传送:

public class GameDownloadViewModel : ViewModelBase 
{ 
    private string _gameName; 
    public string GameName 
    { 
     get { return _gameName; } 
     set 
     { 
      _gameName = value; 
      OnPropertyChanged("GameName"); 
     } 
    } 

    public string StatusText 
    { 
     get 
     { 
      if (_downloadedSize < _totalSize) 
       return string.Format("Downloading {0} MB of {1} MB", _downloadedSize, _totalSize); 
      return "Download completed"; 
     } 
    } 

    private long _totalSize; 
    public long TotalSize 
    { 
     get { return _totalSize; } 
     set 
     { 
      _totalSize = value; 
      OnPropertyChanged("TotalSize"); 
      OnPropertyChanged("Progress"); 
      OnPropertyChanged("StatusText"); 
     } 
    } 

    private long _downloadedSize; 
    public long DownloadedSize 
    { 
     get { return _downloadedSize; } 
     set 
     { 
      _downloadedSize = value; 
      OnPropertyChanged("DownloadedSize"); 
      OnPropertyChanged("Progress"); 
      OnPropertyChanged("StatusText"); 
     } 
    } 

    public double Progress 
    { 
     get 
     { 
      if (_totalSize != 0) 
       return 100.0 * _downloadedSize/_totalSize; 
      return 0.0; 
     } 
    } 
} 

绑定一个ItemsControlObservableCollection<GameDownloadViewModel>,并定义该模板被用来显示每个项目:

<ItemsControl ItemsSource="{Binding GameDownloads}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition /> 
        <RowDefinition /> 
       </Grid.RowDefinitions> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="200" /> 
        <ColumnDefinition /> 
       </Grid.ColumnDefinitions> 
       <TextBlock Grid.Row="0" Grid.Column="0" 
          Text="{Binding GameName}" > 
       <ProgressBar Grid.Row="0" Grid.Column="1" 
          Minimum="0" Maximum="100" Value="{Binding Progress}" /> 
       <TextBlock Grid.Row="1" Grid.Column="1" 
          Text="{Binding StatusText}" > 
      </Grid> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

当进度改变时,只需更新相关GameDownloadViewModel的属性, d视图将相应更新。

+0

+1 o.O这很详细。 –

+0

对不起,你有在VB.net如何从ViewModelBase继承的例子吗?我使用一个代码转换器,但它在继承ViewModelBase和OnPropertyChanged返回错误:公共类GameDownloadViewModel 继承ViewModelBase 私人_gameName作为字符串 公共财产GameName()作为字符串 获取 返回_gameName 最终获取 设置(BYVAL值As String) _gameName = value OnPropertyChanged(“GameName”) End Set End Property –

+0

是否必须将ViewModelBase作为单独的类下载?对不起,我被困在这里,感觉非常沮丧,因为我试图将我的整个项目转换回C#,并遇到很多错误 –

2

不要创建进度,棒阵列,创建一个可绑定类模型数据你需要显示接着说类的集合绑定到ItemsControl具有与网格行的一个形式的模板:

<ItemsControl ItemsSource="{Binding Data}" 
       Grid.IsSharedSizeScope="True"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <!-- Synchronize size accross rows, 
         works in conjunction with Grid.IsSharedSizeScope. --> 
        <ColumnDefinition SharedSizeGroup="A" /> 
        <ColumnDefinition SharedSizeGroup="B" /> 
       </Grid.ColumnDefinitions> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="Auto" /> 
        <RowDefinition Height="Auto" /> 
       </Grid.RowDefinitions> 
       <TextBlock Text="{Binding GameName}" /> 
       <ProgressBar Grid.Column="1" Minimum="0" Maximum="1" Value="{Binding DownloadProgress}" /> 
       <TextBlock Grid.Column="1" Grid.Row="1" Text="{Binding DownloadProgressString}"/> 
      </Grid> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

然后你只需要更新下载对象和UI的特性将反映这些变化。

+0

我们想出了几乎相同的XAML代码...但是你更快,所以+1;)。无论如何,我会留下我的回答,因为它也显示了ViewModel部分。 –

+0

@HB,你好,你能够在编辑的问题上提出建议,试图让上面的代码在UI上显示吗?我创建了DownloadAppViewModel的新对象并为其分配值,但未在UI中显示。谢谢 –

+0

@HB,我将我的项目外包给自由职业者和PeoplePerHour http://www.freelancer.com/projects/Visual-Basic-NET/WPF-Visual-Basic-small-function.html您有兴趣出价吗?它主要基于你的代码 –

相关问题