2011-03-18 45 views
2

我對C#和WPF編程相當陌生,現在這個問題讓我頭疼。設置一個WPF按鈕在IConnectionPoint事件處理程序中可見

該程序應該做什麼:該程序顯示一個帶有文本框的歡迎屏幕,客戶可在其中輸入他的名字。 如果設備靠近無線局域網接入點並連接成功,則應在主窗口上顯示「開始」按鈕。

什麼不工作:設置事件處理程序中的按鈕可見性。新風格不適用。此外,如果我在設置可見性屬性/屬性(?)後嘗試調用任何其他代碼,它將不會運行(如果在設置visib之前放置MessageBox.Show,它將顯示,如果我在設置後該屬性,這個代碼甚至不會達到任何更多)。

的代碼:

這是按鈕元素:

<Button Height="72" HorizontalAlignment="Center" Margin="319,507,315,0" 
     Name="buttonStart" VerticalAlignment="Top" Width="168" FontSize="32" 
     Content="Los geht's" Click="buttonStart_Click" /> 

這是MainWindow.xaml.cs內的事件處理程序登記

public partial class MainWindow : Window, INetworkListManagerEvents 
{ 
    private INetworkListManager nlm_; 
    private IConnectionPoint nlmICP_; 
    private int nlmCookie_ = 0; 

    private void InitNetManager() 
    { 
     nlm_ = new NetworkListManager(); 
     IConnectionPointContainer icpc = (IConnectionPointContainer)nlm_; 
     Guid tempGuide = typeof(INetworkListManagerEvents).GUID; 
     icpc.FindConnectionPoint(ref tempGuide, out nlmICP_); 
     nlmICP_.Advise(this, out nlmCookie_); 
    } 

最後,事件處理程序:

public void ConnectivityChanged(NLM_CONNECTIVITY newConnectivity) 
    { 
     if (newConnectivity == NLM_CONNECTIVITY.NLM_CONNECTIVITY_DISCONNECTED || 
      ((int)newConnectivity & (int)NLM_CONNECTIVITY.NLM_CONNECTIVITY_IPV4_NOTRAFFIC) != 0) 
     { 
      MessageBox.Show("Disconnected"); // this will code is reached 
      buttonStart.Visibility = Visibility.Hidden; // this is not getting applied 
      MessageBox.Show("Disconnected"); // this will code is not reached (stepped with debugger) 
     } 

     if ((((int)newConnectivity & (int)NLM_CONNECTIVITY.NLM_CONNECTIVITY_IPV4_LOCALNETWORK) != 0) || 
      (((int)newConnectivity & (int)NLM_CONNECTIVITY.NLM_CONNECTIVITY_IPV4_INTERNET) != 0)) 
     { 
      MessageBox.Show("Connected"); // see comments above 
      buttonStart.Visibility = Visibility.Visible; 
     } 
    } 

就是這樣 - 我希望你能幫助我。

非常感謝您的努力!

回答

6

嗯 - 現在我覺得不好回答我自己的問題,但我的衝動解決了這個問題,我一直在搜索,最終我發現,我只能從UI線程更改我的WPF元素,但INetwork-Events在不同的線程中被調用。

所以我解決這樣說:

public void ConnectivityChanged(NLM_CONNECTIVITY newConnectivity) 
    { 
     if (newConnectivity == NLM_CONNECTIVITY.NLM_CONNECTIVITY_DISCONNECTED || 
      ((int)newConnectivity & (int)NLM_CONNECTIVITY.NLM_CONNECTIVITY_IPV4_NOTRAFFIC) != 0) 
     { 
      Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(
       delegate() 
       { 
        buttonStart.Visibility = Visibility.Hidden; 
       } 
      )); 
     } 
     // ... 
    } 

感謝您的時間雖然:)

+0

+1用於提供答案 – Marcote 2011-03-19 01:00:54

1

不是直接回答你的問題(因爲它已經回答了),但WPF的方式做事情會要有一個屬性CanConnect你綁定的可見性(與布爾可見性轉換器)。

每當你在你的代碼中觸摸一個UI控件,那麼這是一個很好的指標,表明你的設計需要改進。

+0

對於所有的WPF,這不一定是正確的,但更多的是針對MVVM。 – xdumaine 2011-03-19 01:21:03

+0

那麼,WPF的核心要點之一就是數據綁定,因此您應該利用它 - 無論您是否使用MVVM模式。 – ChrisWue 2011-03-19 01:37:43

+0

謝謝,我會研究一下。始終歡迎指導「如何以正確的方式做事」 – 2011-03-19 08:50:28

相關問題