2

google.comへの接続に応じて色が変わるコントロールを( WPFC#で)実装しようとしています。Googleとの接続がある場合、楕円は緑色です。それ以外は赤です。Ellipse

私はこのようにコーディングしました:

XAML コード

<Window.Resources>
    <l:InternetConnectionToBrushConverter x:Key="InternetConnectionConverter" />
</Window.Resources>
<Grid>
    <DockPanel LastChildFill="True">
        <StatusBar Height="23" Name="statusBar1" VerticalAlignment="Bottom" DockPanel.Dock="Bottom">
            <Label Content="Google connection:" Name="label1" FontSize="10" Padding="3" />
            <Ellipse Name="ellipse1" Stroke="Black" Width="10" Height="10" Fill="{Binding Converter={StaticResource InternetConnectionConverter}}" Margin="0,4,0,0" />
        </StatusBar>
    </DockPanel>
</Grid>

および C# ビハインド コード (値コンバーターと関数チェック接続):

public class InternetConnectionToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (targetType != typeof(Brush))
            throw new InvalidOperationException("The target must be a Brush!");

        return CheckConnection("http://www.google.com/") == true ? Brushes.Green : Brushes.Red;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }

    /// <summary>
    /// Checks connection to specified URL. 
    /// </summary>
    /// <param name="URL"></param>
    /// <returns><b>True</b> if there is connection. Else <b>false</b>.</returns>
    private bool CheckConnection(String URL)
    {
        try
        {
            HttpWebRequest request = WebRequest.Create(URL) as HttpWebRequest;
            request.Timeout = 15000;
            request.Credentials = CredentialCache.DefaultNetworkCredentials;
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;

            return response.StatusCode == HttpStatusCode.OK ? true : false;
        }
        catch (Exception e)
        {
            Debug.WriteLine(e.ToString());
            return false;
        }
    }

}


うまく機能しますが、2 つの問題があります。

  1. 接続を確認するのに時間がかかるので、新しいスレッドで行うべきだと思います(間違っている場合は理由を教えてください)
  2. さらに重要なことは、プログラムの実行が開始されたときに一度だけGoogleとの接続をチェックすることです(バインディングを使用しているにもかかわらず、常に接続が監視されることを期待しています)

これをどのように解決すればよいですか?インターネット接続を切断すると、コントロールの色が変わる
ように、常に接続を監視したいと考えています。Ellipse

4

2 に答える 2

2

アーキテクチャを少し変更する必要があります。UI のロックを回避するため
に、でスレッドを使用することはできません。IValueConverterから戻る前に、スレッドが完了するのを待つ必要がありますIValueConverter

HasConnection楕円の色をバインドするプロパティを作成する必要があります。その後、別のスレッドで接続チェックを実行できます。を使用することをお勧めしBackgroundWorkerます。HasConnectionチェックが完了したら、プロパティを更新する必要があります。その後、タイマーを使用して定期的に接続を確認し、HasConnection各確認後に を更新できます。

編集
イベントを 監視しNetworkChange.NetworkAvailabilityChangedて、ローカル ネットワーク接続がいつアップまたはダウンするかを確認することもできます。ただし、実際にターゲットに接続できることを確認したい場合は、古い を保持する必要がありますが、起動時に、ネットワークの可用性が変化し、タイマーで定期的にCheckConnection呼び出す必要があります。CheckConnection

于 2012-09-02T18:18:12.100 に答える
0

バックグラウンド ワーカーを使用してバックグラウンドで監視し、ReportProgress を使用して現在のステータスを取得します

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    // Get the BackgroundWorker that raised this event.
    BackgroundWorker worker = sender as BackgroundWorker;

    bool connected = false;
    string url = "https://www.google.com/";

    while (!worker.CancellationPending)
    {
        try
        {
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.Timeout = 15000;
            request.Credentials = CredentialCache.DefaultNetworkCredentials;
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;

            connected = (response.StatusCode == HttpStatusCode.OK);
            backgroundWorker1.ReportProgress(10, connected);
            Thread.Sleep(1000);

        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine(ex.ToString());
            e.Cancel = true;
            e.Result = "cancelled";

            //return false;
        }
    }
    e.Result = connected;
}

private void backgroundWorker1_ProgressChanged(object sender,
    ProgressChangedEventArgs e)
{
    this.tbResult.Text = e.ProgressPercentage.ToString();
    System.Diagnostics.Debug.WriteLine(e.UserState.ToString());
}
于 2012-09-17T00:05:22.650 に答える