以编程方式显示不同控件

时间:2015-01-15 06:23:08

标签: c# wpf vb.net xaml controls

在我的WPF应用中,我在窗口中显示不同用户操作的不同控件。例如,当用户选择图像时,我会显示Image控件,当用户选择文本文件时,我会显示TextBox控件。同样,有许多控件可供不同的用户选择。

要做到这一点,我首先使用Visibility = Visibility.Collapsed循环对所有控件执行foreach,然后针对我要显示的控件执行Visibility = Visibility.Visible。< / p>

有更有效的方法吗?在更改控件时,窗口会闪烁并且不会很快,因为有很多控件。

2 个答案:

答案 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。这可以减少一些不必要的屏幕活动。

其次,不是让用户以串行方式体验所有单独的可见性更改,您可能希望将控件保留在可在可见性更改发生之前隐藏的父控件中,然后在更改完成后取消隐藏。您甚至可以使用不透明度动画将其淡出然后重新进入。当然,如果没有看到或了解有关您的应用的更多信息,我无法确定哪些是合适的。