2

私は C# と WPF プログラミングにかなり慣れていませんが、現在、この問題が頭を悩ませています。

プログラムの実行内容:プログラムは、顧客が自分の名前を入力できるテキスト ボックスのあるウェルカム画面を表示します。デバイスがワイヤレス 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" />

これは、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;
        }
    }

それだけです - あなたが私を助けてくれることを願っています。

どうぞよろしくお願いいたします。

4

2 に答える 2

6

うーん-今、私は自分の質問に答えるのが苦手ですが、この問題を解決したいという衝動に駆られてグーグルを続け、最終的には、UI スレッドからしか WPF 要素を変更できないことがわかりましたが、INetwork-Events は a 内で呼び出されます別のスレッド。

だから私はこのようにそれを解決しました:

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

お時間をいただきありがとうございます:)

于 2011-03-19T00:36:36.707 に答える
1

あなたの質問に対する直接的な回答ではありませんが(すでに回答されているため)、WPFの方法は、可視性をバインドするプロパティCanConnectを使用することです(boolから可視性へのコンバーターを使用)。

コード内の UI コントロールに触れることは、デザインを改善する必要があることを示す非常に良い指標です。

于 2011-03-19T01:07:51.950 に答える