Обновить/перезагрузить страницу MUI WPF при изменении вкладки

Я разрабатываю настольное приложение с использованием современного пользовательского интерфейса для WPF. Я пытаюсь обновить свою вкладку, когда перехожу на новую вкладку, но не могу.

Я хочу обновить свою вкладку MUI WPF, когда перехожу на другую страницу с помощью контроллера вкладок.

Может кто-нибудь помочь мне?


person Sandun Harshana    schedule 05.04.2014    source источник


Ответы (3)


Вы можете использовать событие SelectionChanged, чтобы справиться с этим. Вы можете обновить вкладку MUI WPF с помощью SelectionChanged.

<TabControl x:Name="MyTab" SelectionChanged="MyTabControl_SelectionChanged">
    <TabItem x:Name="TabItem1" Header="Tab 1"/>
    <TabItem x:Name="TabItem2" Header="Tab 2"/>
    <TabItem x:Name="TabItem3" Header="Tab 3"/>
</TabControl>

Затем вы можете получить доступ к каждому TabItem в событии:

private void MyTabControl_SelectionChanged(object sender, SelectionChangedEventArgs e){
    if (TabItem1.IsSelected){}
    if (TabItem2.IsSelected){}
    if (TabItem3.IsSelected){}  
}
person manitaz    schedule 18.08.2014
comment
Хорошее начало, но что вы добавляете в скобках?? Я пробовал TabItem1.InvalidateVisual() (как предложено ниже) и TabItem1.UpdateLayout() (согласно ответу здесь - stackoverflow.com/questions/33974939/ ), и ни один из них не работает при нажатии на мою первую вкладку. - person vapcguy; 13.01.2017
comment
У меня была аналогичная проблема с OP, и в итоге я сделал что-то вроде того, что сказал TernaryTopiary в своих комментариях ниже. Вы должны вручную повторно запросить и повторно связать свои ListViews/GridViews. Поэтому я просто сделал это в подпрограмме, которая сохраняла мои данные. Когда я пытался сделать это на SelectionChanged, когда .IsSelected(), как было предложено выше, он пытался выполнить повторную привязку одновременно, как я подозреваю, с начальной загрузкой/привязкой. У меня это вызвало исключение StackOverflowException. - person vapcguy; 13.01.2017

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

Согласно документации MSDN, это:

Отменяет визуализацию элемента и принудительно выполняет новый проход макета. OnRender вызывается после завершения цикла макета.

Например:

        var grid = new Grid();
        // Our grid should refresh after this, 
        // although in normal circumstances it would by default regardless.
        grid.InvalidateVisual();    

Я надеюсь, что это полезно.

person TernaryTopiary    schedule 05.04.2014
comment
Когда я перехожу на вкладку и выполняю транзакцию, например удаление строки, это не обновление. Я хочу перезагрузить свою вкладку, когда перехожу на вкладку из другой. Спасибо - person Sandun Harshana; 06.05.2014
comment
Судя по транзакциям, вы используете какую-то базу данных. В этом случае вам нужно будет снова выполнить запрос к вашей базе данных и соответствующим образом повторно заполнить элементы пользовательского интерфейса. - person TernaryTopiary; 07.05.2014
comment
На одной вкладке я редактирую данные пользователя и обновляю базу данных. Когда я перехожу на другую вкладку и снова возвращаюсь к отредактированной вкладке, я не могу видеть детали редактирования. Но база данных была обновлена. Чтобы увидеть новые данные, я снова запустил программу. - person Sandun Harshana; 09.05.2014
comment
Если бы это был я, моей первой идеей было бы проверить результаты запроса, чтобы убедиться, что ваши изменения поступают в базу данных, либо во время отладки, либо в сторонней программе, предназначенной для просмотра баз данных. Если ваша база данных обновляется, как вы говорите, то мне кажется, что изменения не распространяются из базы данных в ваш интерфейс (иначе: запросы, которые вы используете для получения данных в интерфейсе, не выполняются на событие OnTabChanged для TabControl), поэтому я бы исследовал это. Возможно, вам придется повторно выполнить запрос для вкладки, которую вы хотите обновить. - person TernaryTopiary; 09.05.2014
comment
Именно то, что я должен был сделать - повторно запросить базу данных и повторно связать результаты. grid.InvalidateVisual(); не сделал это автоматически, для меня. - person vapcguy; 13.01.2017

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

MUI включает в себя структуру навигации по содержимому, которая обрабатывает загрузку, выгрузку и навигацию по истории на основе URI ссылок. Если вы хотите, чтобы ваш контент знал о событиях навигации, таких как события загрузки и выгрузки, вам необходимо реализовать интерфейс.

Сделайте навигацию по контенту осознанной, реализуя интерфейс IContent, доступный в пространстве имен FirstFloor.ModernUI.Windows.

Простой пример:

public class MyContent : UserControl, IContent
{
  public void OnFragmentNavigation(FragmentNavigationEventArgs e)
  {
  }
  public void OnNavigatedFrom(NavigationEventArgs e)
  {
  }
  public void OnNavigatedTo(NavigationEventArgs e)
  {
    //Refresh your page here
  }
  public void OnNavigatingFrom(NavigatingCancelEventArgs e)
  {
    // ask user if navigating away is ok
    if (ModernDialog.ShowMessage("Navigate away?", "navigate", MessageBoxButton.YesNo) == MessageBoxResult.No) {
      e.Cancel = true;
    }
  }
}
person Williams Abiola    schedule 08.08.2018