-1


別のクラスのイベントが発生したときにフレームを更新する機能を持つフレームがあります。クラス「IRCClient」と「MainFrame」があります。IRCClient クラスにはイベント「OnMessageRecvd」があり、メインフレームには関数「HandleNewMessageReceived」があります。MainFrame クラスには、変数 'CurrentServer' と 'CurrentChannel' があり、現在ユーザーに表示されているサーバーのチャンネルを示します。

ここで、ボタンのコールバックで「CurrentServer」と「CurrentChannel」を設定すると、値があり、すべて問題ありません。ただし、IRCClient の「OnMessageRecvd」イベントによって「HandleNewMessageReceived」関数が呼び出されると、CurrentServer と CurrentChannel は両方とも、MainFrame のコンストラクターで指定された任意の値 (null) に等しくなります。

この動作の原因が何であるかを知っている人はいますか? よろしくお願いします。

編集: 以下はコードです。問題のコード (CurrentChannel および CurrentServer プロパティを使用する関数) のみを投稿し、無関係なコードを切り取りました。

// Main page, shows chat history.
public sealed partial class MainPage : LIRC.Common.LayoutAwarePage
{
    private uint maxMessages;
    IRCClient ircc;
    IRCHistory irch;
    string CurrentServer, CurrentChannel;

    // Does all the setup for this class.
    public MainPage()
    {
        this.InitializeComponent();

        ircc = App.ircc; // This is a global variable in the 'App' class.
        ircc.OnMessage += NewMessageReceived;

        irch = App.irch; // This is also a global variable in the 'App' class.
        currentChannel = currentServer = null;
    }

    // Restores the previous state.
    protected override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
    {
        if (pageState != null)
        {
            if(pageState.ContainsKey("viewedChannel"))
            {
                // Retrieve required info.
                string[] viewedChannelTokens = (pageState["viewedChannel"] as string).Split('.');
                CurrentChannel = viewedChannelTokens[0];
                CurrentServer = viewedChannelTokens[1];

                // If the saved channel or server got corrupt
                if (string.IsNullOrEmpty(CurrentChannel) || string.IsNullOrEmpty(CurrentServer))
                {
                    // Check if a channel is open, if so, select it.
                    *snip* // Non-relevant code.
                }

                // Clear and load required history.
                ClearHistory();
                if(CurrentServer != null && CurrentChannel != null)
                    LoadHistory(CurrentServer, CurrentChannel);
            }
        }

        // Create buttons that switch to a channel
        *Snip* // Calls AddChannelButton
    }

    // Creates a button that, when clicked, causes the ChatHistoryView to display the ChannelHistory.
    void AddChannelButton(string Server, string Channel)
    {
        Button btn = new Button();
        btn.Content = Channel + "\n" + Server;
        btn.Width = 150;

        // A function to switch to another channel.
        btn.Click += (e, s) =>
        {
            ClearHistory(); // Clears the ChatHistoryVi.ew field.
            LoadHistory(Server, Channel); // Does the actual loading of the channel history

            CurrentChannel = Channel;
            CurrentServer = Server;
        };

        ChannelBar.Children.Add(btn);
    }

    // The function that is called by the IRCClient.OnMessageRecv event.
    public void NewMessageReceived(ref DataWriter dw, IRCServerInfo ircsi, IRCClient.RecvMessage recvmsg)
    {
        if (ircsi.Name == CurrentServer && CurrentChannel == recvmsg.recipient)
        {
            AddMessage(DateTimeToTime(DateTime.UtcNow), recvmsg.author, recvmsg.message);
        }
    }
}

// Responsible for creating, managing and closing connections.
public class IRCClient
{
    // A structure that describes a message.
    public struct RecvMessage
    {
        public string author;   // Nickname
        public string realName;
        public string ipAddress;
        public string recipient; // Indicates in what channel or private converstion.
        public string message;   // The actual message
    };

    // Describes how a function that handles a message should be declared.
    public delegate void MessageHandler(ref DataWriter dw, IRCServerInfo ircsi, RecvMessage msg);

    // Gets raised/called whenever a message was received.
    public event MessageHandler OnMessage;
}
4

1 に答える 1

0

あなたが言ったことから何が起こっているのかは明らかではありませんが、変数をチェックしたときにコンストラクターで設定した値に変数が設定されている場合は、変数が変更されると予想されるまでにまだ変更されていないことを意味しますまたは、自分が持っていると思っていた変数の代わりに、他の変数の値を設定しました。

ただし、これらは単なる推測であり、コードを示さずに推測以上のものを期待することはできません。

于 2012-11-25T22:52:41.447 に答える