【问题标题】:Refresh/Reload MUI WPF Page when Tab is Changed更改选项卡时刷新/重新加载 MUI WPF 页面
【发布时间】:2014-04-05 07:27:50
【问题描述】:

我正在使用 WPF 的 Modern UI 开发一个桌面应用程序。当我转到新标签页时,我尝试刷新我的标签页,但我不能。

当我使用标签控制器转到另一个页面时,我想刷新我的 MUI WPF 标签页。

谁能帮帮我?

【问题讨论】:

    标签: c# wpf xaml tabs modern-ui


    【解决方案1】:

    我不太确定您的确切意思,但是通过在控件上调用 InvalidateVisual(),您可以强制对其进行视觉刷新,如果这是您所追求的,因为听起来您有一个 WPF数据变化时不更新的控件。

    基于MSDN documentation,这个:

    使元素的渲染无效,并强制进行全新的布局传递。 OnRender 在布局周期完成后调用

    例如:

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

    我希望这是有用的。

    【讨论】:

    • 当我转到标签页并执行删除行之类的事务时,它不会刷新。当我从另一个标签页来到标签页时,我想重新加载我的标签页。谢谢
    • 从提到事务,听起来你正在使用某种数据库。在这种情况下,您需要再次对数据库执行查询并相应地重新填充 UI 元素。
    • 在一个标签页中,我编辑用户详细信息并更新数据库。当我转到另一个标签页并再次进入已编辑的标签页时,我看不到编辑详细信息。但数据库已更新。查看新的详细信息我已经再次运行程序了。
    • 如果是我,我的第一个想法是检查查询结果以确保您的更改将进入数据库,无论是在调试时还是在旨在浏览数据库的第三方程序中。如果您的数据库正在按您所说的那样进行更新,那么对我来说,听起来更改没有从数据库传播到您的界面(又名:您用来获取数据到界面的查询没有运行TabControl 的 OnTabChanged 事件),所以我会对此进行调查。您可能需要针对要更新的选项卡重新运行查询。
    • 正是我必须做的——重新查询数据库并重新绑定结果。 grid.InvalidateVisual(); 对我来说不是自动完成的。
    【解决方案2】:

    您可以使用 SelectionChanged 事件来处理此问题。您可以使用 SelectionChanged 刷新 MUI WPF 标签页。

    <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){}  
    }
    

    【讨论】:

    • 一个好的开始,但是您在括号内添加了什么?我尝试了TabItem1.InvalidateVisual()(如下所示)和TabItem1.UpdateLayout()(根据此处的答案-stackoverflow.com/questions/33974939/…),单击我的第一个选项卡时都不起作用。
    • 有一个与 OP 类似的问题,我最终做的事情就像 TernaryTopiary 在他的 cmets 中所说的那样,如下所示。您必须手动重新查询并重新绑定您的 ListViews/GridViews。所以我只是在保存数据的例程中执行此操作。当我尝试在SelectionChanged 上执行此操作时,.IsSelected(),如上所述,我怀疑它正在尝试重新绑定,就像执行初始加载/绑定一样。对我来说,它导致了 StackOverflowException。
    【解决方案3】:

    虽然选择的答案没问题,但它可能不是最好的解决方法。

    MUI 包含一个内容导航框架,可处理基于链接 uri 的内容加载、卸载和历史导航。如果您希望您的内容知道加载和卸载事件等导航事件,则需要实现一个接口。

    通过实现 FirstFloor.ModernUI.Windows 命名空间中可用的 IContent 接口,让您的内容导航具有感知能力。

    一个简单的例子是:

    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;
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多