在我的WPF应用中,我在窗口中显示不同用户操作的不同控件。例如,当用户选择图像时,我会显示Image
控件,当用户选择文本文件时,我会显示TextBox
控件。同样,有许多控件可供不同的用户选择。
要做到这一点,我首先使用Visibility = Visibility.Collapsed
循环对所有控件执行foreach
,然后针对我要显示的控件执行Visibility = Visibility.Visible
。< / p>
有更有效的方法吗?在更改控件时,窗口会闪烁并且不会很快,因为有很多控件。
答案 0 :(得分:2)
我总是使用ContentControl
。它产生非常干净的xaml代码并且是超快的,即使在相当负载的视图中我也从未见过任何闪烁。它确实需要WPF之外的任何额外框架。
<ContentControl Content="{Binding Selected}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type viewModels:FirstOne}">
<!-- View code for first view goes here -->
<TextBlock>Hi</TextBlock>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModels:SecondOne}">
<!-- View code for second view goes here -->
<Image Source="{Binding Image}" />
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
然后我有一个MainViewModel
用属性
class MainViewModel: ViewModel, INavigation
{
public ViewModel Selected
{
get { return _selected; }
private set
{
_selected = value;
RaisePropertyChanged();
}
public void Show(ViewModel viewModel) { Selected = viewModel; }
}
}
INAVigation接口就是这样的
interface INavigation { void Show(ViewModel viewModel); }
示例视图模型
class FirstOne: ViewModel
{
private readonly INavigation _navigation;
public FirstOne(INavigation navigation) { _navigation = navigation; }
public void ButtonClicked()
{
_navigation.Show(new SecondOne());
}
}
答案 1 :(得分:0)
首先,您可能希望避免对即将显示的控件执行Visibility=Visibility.Collapsed
。这可以减少一些不必要的屏幕活动。
其次,不是让用户以串行方式体验所有单独的可见性更改,您可能希望将控件保留在可在可见性更改发生之前隐藏的父控件中,然后在更改完成后取消隐藏。您甚至可以使用不透明度动画将其淡出然后重新进入。当然,如果没有看到或了解有关您的应用的更多信息,我无法确定哪些是合适的。