2

WP7プロジェクトでパフォーマンスプログレスバーを使用しようとしていますが、非同期Webクライアント呼び出しで問題が発生します。私のコードは次のとおりです。

アップデート

    public MainPage()
    {
        InitializeComponent();
         ...................

        this.Loaded += new RoutedEventHandler(MainPage_Loaded);}

    private void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        if (!App.ViewModel.IsDataLoaded)
        {
            App.ViewModel.LoadData();
        }
    }

そして、LoadData関数を実装するViewModel

    private bool _showProgressBar = false;
    public bool ShowProgressBar
    {
        get { return _showProgressBar; }
        set
        {
            if (_showProgressBar != value)
            {
                _showProgressBar = value;
                NotifyPropertyChanged("ShowProgressBar");
            }
        }
    public void LoadData()
    {
        try
        {
            string defaulturl = "http://....";
            WebClient client = new WebClient();
            Uri uri = new Uri(defaulturl);
            client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
            ShowProgressBar = true;
            client.DownloadStringAsync(uri);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

        this.IsDataLoaded = true;

    }

    void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        try
        {
            //fetch the data
           ShowProgressBar = false;
        }

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String propertyName)
    {.....
    } 

MainPage Xaml

    <toolkit:PerformanceProgressBar Margin="0,-12,0,0" x:Name="performanceProgressBar" IsIndeterminate="true" Visibility="{Binding ShowProgressBar, Converter={StaticResource BooleanToVisibilityConverter}}"/>

私の問題は、WebClientは実行時に非同期メソッドであるため、LoadDataがすでに実行されており、performanceProgressBar.Visibilityを配置する場所がわからないことです。

どんな助けでもいただければ幸いです。ありがとう!

4

2 に答える 2

1

コメントで詳しく説明していただいた後、理解が深まりました。プログレスバーの可視性にブール値のプロパティをバインドしたいようです。ブール値から可視性へのコンバーターが必要です (Google で検索すると簡単に見つかります)。

次に、次のようなことができます。

private bool _showProgressBar = false;
public bool ShowProgressBar
{
    get { _return _showProgressBar; }
    set 
    { 
        _return _showProgressBar;
        OnPropertyChanged("ShowProgressBar");
    }
}

public void LoadData()
{
    try
    {
        string defaulturl = "http://....";
        WebClient client = new WebClient();
        Uri uri = new Uri(defaulturl);
        client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);

        ShowProgressBar = true;

        client.DownloadStringAsync(uri);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

    this.IsDataLoaded = true;

}

void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    try
    {
        //fetch the data
        ShowProgressBar = false;
    }

    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

}

ビューで:

<MyProgressBar Visibility={Binding Path=ShowProgressBar, Converter={StaticResource MyBoolToVisibleConverter}>

どうやら、MSFT は既にコンバーターを提供しています...これは私にとってニュースです: http://msdn.microsoft.com/en-us/library/system.windows.controls.booleantovisibilityconverter.aspx

于 2012-06-15T21:03:40.947 に答える
0

UIスレッドに戻る必要があるだけです-これDispatcherはあなたを助けることができ、私が使用する一般的なスニペットです(私のViewModelBaseでは次のとおりです:

    protected delegate void OnUIThreadDelegate();
    /// <summary>
    /// Allows the specified deelgate to be performed on the UI thread.
    /// </summary>
    /// <param name="onUIThreadDelegate">The delegate to be executed on the UI thread.</param>
    protected void OnUIThread(OnUIThreadDelegate onUIThreadDelegate)
    {
        if (Deployment.Current.Dispatcher.CheckAccess())
        {
            onUIThreadDelegate();
        }
        else
        {
            Deployment.Current.Dispatcher.BeginInvoke(onUIThreadDelegate);
        }
    }

これは、次のように簡単に使用できます。

void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    try
    {
        //fetch the data

        this.OnUIThread(() =>
        {
            performanceProgressBar.Visibility = Visibility.Collapsed; // This code will be performed on the UI thread -- in your case, you can update your progress bar etc.
        });

    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

} 
于 2012-06-15T20:49:47.017 に答える