【发布时间】:2014-04-05 07:27:50
【问题描述】:
我正在使用 WPF 的 Modern UI 开发一个桌面应用程序。当我转到新标签页时,我尝试刷新我的标签页,但我不能。
当我使用标签控制器转到另一个页面时,我想刷新我的 MUI WPF 标签页。
谁能帮帮我?
【问题讨论】:
标签: c# wpf xaml tabs modern-ui
我正在使用 WPF 的 Modern UI 开发一个桌面应用程序。当我转到新标签页时,我尝试刷新我的标签页,但我不能。
当我使用标签控制器转到另一个页面时,我想刷新我的 MUI WPF 标签页。
谁能帮帮我?
【问题讨论】:
标签: c# wpf xaml tabs modern-ui
我不太确定您的确切意思,但是通过在控件上调用 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();
我希望这是有用的。
【讨论】:
grid.InvalidateVisual(); 对我来说不是自动完成的。
您可以使用 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/…),单击我的第一个选项卡时都不起作用。
SelectionChanged 上执行此操作时,.IsSelected(),如上所述,我怀疑它正在尝试重新绑定,就像执行初始加载/绑定一样。对我来说,它导致了 StackOverflowException。
虽然选择的答案没问题,但它可能不是最好的解决方法。
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;
}
}
}
【讨论】: