一次显示多个控件

时间:2017-09-27 21:20:48

标签: c# wpf mvvm rendering

我正在使用WPF框架和MVVM开发UI。 这是加载时的网格: image of the grid while displaying

这是渲染完成后的UI:

image of the grid when rendering is finished

因此,作为示例,第3列不活动并将崩溃。但是用户可以在主窗口中看到整个建筑物的UI。 我得到的每个视图都取决于viewmodel。而且控件也有自己的视图模型。当我在一个控件中一起获取我的信息时,WPF将获取信息并绘制整个控件,例如我的tablecontrol。这是一种自制控件,即获取数据并在网格中显示数据。因为它是一个控件,所以整个网格在后台加载并立即显示。当我创建自己的网格时,由于我的tablecontrol无法处理数据,网格中的每个控件都会一个接一个地显示,网格会慢慢显示在主窗口上。

<Grid HorizontalAlignment="Left">
<Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto"/>
    <ColumnDefinition Width="Auto"/>  
    .
    .
    .      
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
    <RowDefinition Height="Auto"/>
    <RowDefinition Height="Auto"/>   
    .
    .
    .    
</Grid.RowDefinitions>
    <unitControls:Label Grid.Row="1" Grid.Column="0" Text="{Binding xx}"/>
    <unitControls:Label Grid.Row="1" Grid.Column="1" Text="{Binding xx}"/>
    <unitControls:Label Grid.Row="1" Grid.Column="2" Text="{Binding xx}"/>    
    .
    .
    .
    <unitControls:Label Grid.Row="7" Grid.Column="7" Text="{Binding xx}"/>
    <unitControls:Label Grid.Row="7" Grid.Column="8" Text="{Binding xx}"/>
    <unitControls:Label Grid.Row="7" Grid.Column="9" Text="{Binding xx}"/>  
<Grid>

有没有办法一次在一个视图中显示整个内容?我试图在viewmodel中操纵调度程序,但没有任何帮助。

1 个答案:

答案 0 :(得分:0)

尝试这样的事情:

XAML

<Window x:Class="Example.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <DockPanel>
        <Button Content="Collect data" Click="OnCollectData" DockPanel.Dock="Top"/>
        <ContentControl x:Name="HostControl"/>
    </DockPanel>
</Window>

CS

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private async void OnCollectData(object sender, RoutedEventArgs e)
    {
        var data = await CollectDataAsync();
        HostControl.Content = new MyCustomGridControl(data);
    }

    private async Task<GridDataHolder> CollectDataAsync()
    {
        GridDataHolder result = null;
        await Task.Run(() =>
        {
            // Collect the logical data on the thread pool
            result = GetGridData();
        });
        return result;
    }
}

您可以将HostControl与ProgressBar放在网格中,并使用ProgressBar的Visibility属性来改善用户体验。