Динамическое изменение содержимого в окне WPF из нескольких элементов UserControl - PullRequest
0 голосов
/ 21 мая 2018

У меня есть два пользовательских элемента управления, такие как LogInControl и CheckControl.Первоначально окно содержит LogInControl, и окно успешного входа изменяется после успешного входа в систему: окно содержит CheckControl.

Это код из MainWindow

public MainWindow()
        {
            InitializeComponent();

            LogInControl logInControl = new LogInControl();
            CheckControl checkControl = new CheckControl();
            logInControl.OnSuccessfulLogin += (senser, e) =>
            {
                ChangeContentControl("Check");
            };

            checkInControl.LogOutClick += (senser, e) =>
            {
                ChangeContentControl("LogIn");
            };
            this.contentControl.Content = logInControl;
        }

        public void ChangeContentControl(string kindContentControl)
        {
            switch (kindContentControl)
            {
                case "LogIn":
                    {
                        ...
                        this.contentControl.Content = new LogInControl();
                    }
                    break;
                case "Check":
                    {
                        ...
                        this.contentControl.Content = new CheckControl();
                    }
                    break;
            }
        }

Это код изLogInControl

public event EventHandler OnSuccessfulLogin;
private void loginButton_Click(object sender, RoutedEventArgs e)
        {
            OnSuccessfulLogin?.Invoke(this, e);
        }

Работает правильно.Но у «CheckControl» есть кнопка «Выход», при нажатии на эту кнопку в окне должен появиться контент «LogInControl».Но это не происходит.

Это код из CheckControl

public event EventHandler LogOutClick;
        private void logOutButton_Click(object sender, RoutedEventArgs e)
        {
            LogOutClick?.Invoke(this, e);
        }

LogOutClick Отслеживание событий останавливается при переходе в окно с CheckInControl (LogOutClick становится пустым).Я не могу понять, почему это происходит.Помогите мне, пожалуйста.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

вы создаете 2 экземпляра каждого элемента управления.первый в конструкторе, и они подписаны на событие.вторая в методе ChangeContentControl, и у них нет подписки на события.

, поэтому вы можете повторно использовать элементы управления, сохранив их в локальной переменной

LogInControl logInControl = new LogInControl();
CheckControl checkControl = new CheckControl();

public MainWindow()
{
    InitializeComponent();

    logInControl.OnSuccessfulLogin += (senser, e) =>
    {
        ChangeContentControl("Check");
    };

    checkInControl.LogOutClick += (senser, e) =>
    {
        ChangeContentControl("LogIn");
    };
    this.contentControl.Content = logInControl;
}

public void ChangeContentControl(string kindContentControl)
{
    switch (kindContentControl)
    {
        case "LogIn":
            {
                ...
                this.contentControl.Content = logInControl ;
            }
            break;
        case "Check":
            {
                ...
                this.contentControl.Content = checkControl;
            }
            break;
    }
}

или подписав новуюэкземпляры к событию также.Контроль с подпиской создается отдельным способом, чтобы избежать дублирования кода

public MainWindow()
{
    InitializeComponent();

    this.contentControl.Content = getLogInControl();
}

private LogInControl getLogInControl()
{
    LogInControl logInControl = new LogInControl();
    logInControl.OnSuccessfulLogin += (senser, e) =>
    {
        ChangeContentControl("Check");
    };
    return logInControl;
}

private CheckControl getCheckControl()
{
    CheckControl checkControl = new CheckControl();
    checkControl.LogOutClick += (senser, e) =>
    {
        ChangeContentControl("LogIn");
    };
    return checkControl;
}

public void ChangeContentControl(string kindContentControl)
{
    switch (kindContentControl)
    {
        case "LogIn":
            {
                ...
                this.contentControl.Content = getLogInControl();
            }
            break;
        case "Check":
            {
                ...
                this.contentControl.Content = getCheckControl();
            }
            break;
    }
}
0 голосов
/ 21 мая 2018

Проблема, с которой вы сталкиваетесь, заключается в том, что когда вы переключаете элементы управления, вы создаете новые.Новый не имеет зарегистрированных событий.Таким образом, вы перезаписываете ранее созданное с зарегистрированными событиями.

switch (kindContentControl)
{
    case "LogIn":
    {
        ...                           
        this.contentControl.Content = new LogInControl(); <- here
                                      ^^^------------
    }
    break;

    case "Check":
    {
        ...
        this.contentControl.Content = new CheckControl(); <- here
    }
    break;
}

FIX : Вы должны назначить ранее созданные элементы управления:

Эти переменные должны бытьполя, потому что вы хотите получить доступ к одному и тому же экземпляру разными способами:

private LogInControl logInControl = new LogInControl();
private CheckControl checkControl = new CheckControl();

, а переключатель должен быть таким:

switch (kindContentControl)
{
    case "LogIn":
    {
        ...
        this.contentControl.Content = this.logInControl;                    
    }
    break;

    case "Check":
    {
        ...
        this.contentControl.Content = this.checkControl;
    }
    break;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...