2011-03-18 2 views
2

저는 C# 및 WPF 프로그래밍을 처음 접했을 뿐이므로이 문제로 인해 두통이 생깁니다.WPF 단추를 IConnectionPoint 이벤트 처리기 내에서 볼 수 있도록 설정하십시오.

프로그램이 수행해야하는 것 : 고객이 그의 이름을 입력 할 수있는 텍스트 상자가있는 시작 화면이 표시됩니다. 장치가 무선 LAN 액세스 포인트 근처에서 성공적으로 연결되면이 기본 창의 "시작"버튼이 표시되어야합니다.

작동하지 않는 것 : 이벤트 처리기 내에서 버튼 가시성을 설정합니다. 새 스타일이 적용되지 않습니다. 또한 가시성 속성/속성 (?)을 설정 한 후 다른 코드를 호출하려고하면 실행되지 않습니다 (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" /> 

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_); 
    } 

그리고 마지막으로하여 MainWindow.xaml.cs를 내 이벤트 핸들러 등록은 다음과 같습니다

이 버튼 요소입니다 이벤트 처리기 :

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 이벤트 다른 스레드 내에서 호출됩니다.

그래서 나는 이런 식으로 해결 : 당신의 생각 시간 :

+0

+1 대답을 제공하는 경우 – Marcote

1

하지 귀하의 질문에 직접 대답 (이미 대답 있기 때문에)하지만 일을 할 수있는 WPF 방법에 대한

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; 
       } 
      )); 
     } 
     // ... 
    } 

감사합니다 것 CanConnect 속성을 사용하여 가시성을 바인딩 할 수 있습니다 (bool에서 가시성 변환기로).

코드에서 UI 컨트롤을 터치 할 때마다 디자인을 개선해야한다는 것을 나타내는 매우 좋은 지표입니다.

+0

이것은 모든 WPF에서 반드시 필요한 것은 아니지만 MVVM에서 더 많이 적용됩니다. – xdumaine

+0

WPF의 핵심 요점 중 하나는 데이터 바인딩이므로 MVVM 패턴 사용 여부와 상관없이이를 활용해야합니다. – ChrisWue

+0

고마워요, 제가 살펴 보겠습니다. "올바른 방법으로 일하는 방법"을 가리키는 포인터는 언제나 환영합니다 :) –