none
WPF动态加载页面会卡顿 RRS feed

  • 问题

  • 我使用的是mvvm模式,在viewmodel中创建了一个字典,把我软件中几个主要的界面(usercontrol格式)new出来存到了字典中,界面放了一个ContentControl,Content属性与后台绑定,这样,当点击界面上按钮时,我会从字典中找到对应的页面然后传给ContentControl的Content。

    不过在我界面开始变得稍微复杂之后,每次切换界面就开始出现卡顿,复杂的界面切换时,会卡顿半秒钟以上,有没有什么好的办法可以解决这个问题?

    我试过fream,tabcontrol,只有很小的提升。

    当直接写tabcontrol时,即使界面很复杂,也可以瞬间切换,但是绑定的就很卡

    2020年8月13日 3:40

全部回复

  • 你好,

    根据你的描述,我做了一个简单的测试,并没有重现你的问题,以下是demo的代码:

     public class ViewModel : INotifyPropertyChanged
        {
            Dictionary<string, string> pairs = new Dictionary<string, string>();
            public Dictionary<string, string> Pairs
            {
    
                get { return pairs; }
                set
                {
                    pairs = value;
                    NotifyPropertyChanged("Pairs");
                }
            }
    
            public ViewModel()
            {
                Pairs.Add("UserControl1", "MyUserCtrs\\UserControl1.xaml");
                Pairs.Add("UserControl2", "MyUserCtrs\\UserControl2.xaml");
                Pairs.Add("UserControl3", "MyUserCtrs\\UserControl3.xaml");
    
            }
            public event PropertyChangedEventHandler PropertyChanged;
            public void NotifyPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
        }

    MainWindow页面代码是:

    <Window.DataContext>
            <local:ViewModel></local:ViewModel>
        </Window.DataContext>
        <ContentControl>
            <TabControl ItemsSource="{Binding Pairs}">
                <TabControl.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Key}"/>
                    </DataTemplate>
                </TabControl.ItemTemplate>
                <TabControl.ContentTemplate>
                    <DataTemplate >
                        <Frame Source="{Binding Value}"></Frame>
                    </DataTemplate>
                </TabControl.ContentTemplate>
                
            </TabControl>
    
        </ContentControl>

    请查看一下,是否与你的代码类似,如果完全不同,你可以提供你的sample供我测试分析吗?

    谢谢

    Daisy  Tian


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2020年8月13日 7:06
  • hi 疯子

       我懂你的意思,我有个项目和你用的一样的方案,也有一样的问题。请问现在问题有解决思路吗

    2020年8月28日 6:17
  • 要不要尝试先将页面加载后在传递绑定内容?

    你的绑定内容是否递归的内容?

    你可以参考一下

    界面和你一样都是放置contencontrol,不过将页面作为datatemplate而已,数据作为content。

    我将代码传到了码云 你可以看一下

    https://gitee.com/TK_King/wpf-page-transmition

    2020年8月29日 9:22
  • 要试试先加载页面,在传递绑定内容嘛?

    https://gitee.com/TK_King/wpf-page-transmition

    2020年8月29日 9:22
  • hi ARM

       我下载了你的代码看了一会儿,还不是很理解,特别时下面的代码,可以做些解释吗?

     DataTemplateKey key = new DataTemplateKey(Data.GetType());
                    DataTemplate template = new DataTemplate(Data.GetType());
                    template.VisualTree = new FrameworkElementFactory(Data.ViewType);
                    Resource.Add(key, template);

    2020年9月3日 9:43
  • 数据模板是可以根据装载此模板的数据源类型来匹配对应的数据模板。

    例如

    模板A,数据类型为ClassA

    模板B,数据类型为ClassB

    当控件的资源中存在模板A,B,你给控件的数据源数据类型为ClassA则自动使用A模板,一次类推。

    这样的方法具有头分类的模板中很常见

    2020年9月5日 13:37
  • hi ARM

       这样的方法具有头分类的模板中很常见-------头分类的模板是什么意思,可以详细解释一下吗

    2020年10月11日 14:08