Установка кнопки WPF для отображения в обработчике событий IConnectionPoint
Я довольно новичок в программировании на C# и WPF, и сейчас эта проблема вызывает у меня головную боль.
Что должна делать программа: Программа отображает экран приветствия с текстовым полем, в котором клиент может ввести свое имя. Если устройство подходит к точкам доступа беспроводной локальной сети и успешно подключается, должна появиться кнопка "Пуск" в этом главном окне.
Что не работает: настройка видимости кнопки внутри обработчика событий. Новый стиль не применяется. Кроме того, если я попытаюсь вызвать любой другой код после установки атрибута / свойства видимости (?), Он не запустится (если я поставлю MessageBox.Show прямо перед установкой visib. Он будет показан, если я поставлю его после установки свойство, этот код даже не будет достигнут).
Код:
Это кнопка Элемент:
<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;
}
}
Вот и все - я надеюсь, что вы можете мне помочь.
Заранее большое спасибо за ваши усилия!
2 ответа
Хм - теперь я чувствую себя плохо из-за того, что отвечаю на свой вопрос, но мое желание решить эту проблему заставило меня погуглить, и, наконец, я обнаружил, что я могу изменять только свои элементы 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;
}
));
}
// ...
}
Спасибо за ваше время, хотя:)
Не прямой ответ на ваш вопрос (потому что на него уже дан ответ), но WPF может сделать так, чтобы свойство CanConnect, с которым вы связывали видимость (с преобразователем bool to visibility).
Всякий раз, когда вы касаетесь элемента управления UI в вашем коде, это очень хороший показатель того, что ваш дизайн нуждается в улучшении.