google.comへの接続に応じて色が変わるコントロールを( WPF、C#で)実装しようとしています。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 つの問題があります。
- 接続を確認するのに時間がかかるので、新しいスレッドで行うべきだと思います(間違っている場合は理由を教えてください)
- さらに重要なことは、プログラムの実行が開始されたときに一度だけGoogleとの接続をチェックすることです(バインディングを使用しているにもかかわらず、常に接続が監視されることを期待しています)
これをどのように解決すればよいですか?インターネット接続を切断すると、コントロールの色が変わる
ように、常に接続を監視したいと考えています。Ellipse