Установка кнопки WPF для отображения в обработчике событий IConnectionPoint - PullRequest
2 голосов
/ 19 марта 2011

Я довольно новичок в программировании на 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 ]

6 голосов
/ 19 марта 2011

Хм - теперь я чувствую себя плохо из-за того, что отвечаю на свой вопрос, но мое желание решить эту проблему заставило меня гуглить, и, наконец, я обнаружил, что могу изменять только свои элементы 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;
                }
            ));
        }
        // ...
    }

Спасибо за ваше время, хотя:)

1 голос
/ 19 марта 2011

Не прямой ответ на ваш вопрос (потому что на него уже дан ответ), но способ WPF состоит в том, чтобы иметь свойство CanConnect, с которым вы связываете видимость (с помощью преобразователя bool to visibility).

Всякий раз, когда вы касаетесь элемента управления пользовательского интерфейса в своем коде, это очень хороший показатель того, что ваш дизайн нуждается в улучшении.

...