c# - एक खिड़की में 25 डब्ल्यूपीएफ़ कैलेंडर, विंडो खोलने में 5 सेकंड लगते हैं




wpf performance xaml calendar (4)

मैं WPF के लिए नया हूँ, और यह जानने की कोशिश कर रहा था कि यह कितना धीमा हो सकता है। मैंने Visual Studio 2010 (.NET 4) में एक नया WPF ऐप शुरू किया, और यह XAML बनाया:

<Window x:Class="CalendarTest1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="800" Width="1000">
    <WrapPanel>
        <Calendar />
        <Calendar />
        <Calendar />
...repeats for a total of 25 calendar objects...
    </WrapPanel>
</Window>

जब मैं अपना आवेदन चलाता हूं, तो आईडीई में या नहीं, विंडो खोलने के लिए 5 सेकंड लगते हैं। एक बार खोलने पर, यह जल्दी से लाल हो जाता है (जैसा मैं इसे बदलूंगा) और सब कुछ बहुत तेज़ लगता है।

मेरा पीसी सबसे तेज़ नहीं है: एएमडी ड्यूल कोर 2.3GHz, 2 जीबी रैम, एक्सपी 32-बिट ओएस, ऑन-बोर्ड वीडियो

मैं कैलेंडर के बजाय 25 बटन, और 1 सेकंड से कम में लोड कर सकता हूं।

मैं एमएस आउटलुक कैलेंडर में दिन के दृश्य में कुछ महीने के कैलेंडर की तरह कुछ बनाने की कोशिश कर रहा हूं, जैसे:

इसलिए मैं सोच रहा था कि मैं रैपपैनेल का उपयोग कर सकता हूं और कैलेंडर नियंत्रणों को जोड़ता / हटा सकता हूं क्योंकि यह आकार बदलता है मुझे 25 की ज़रूरत नहीं है, लेकिन 9 या 12 के साथ भी मुझे धीमा लगता है (मुझे एक विरासत Win32 ऐप है जो 18 कैलेंडर्स को 1 सेकंड से कम समय में प्रदर्शित करता है)।

मेरे प्रश्न हैं:

क्या एक निश्चित डिजाइन के कारण कैलेंडर नियंत्रण धीमा है - या तो खराब डिज़ाइन, या इस उपयोग के लिए तैयार नहीं है, या यह बहुत धीमा है क्योंकि यह बहुत सारे डेटा / नियंत्रण / जानकारी प्रदर्शित करने की कोशिश कर रहा है?

यदि मैं अपने खुद के नियंत्रण को बनाने के लिए परेशानी में जाता हूं, तो मान लेता हूं कि मैं एक अच्छी डिजाइन (सामान्य विचारों का स्वागत) का उपयोग करता हूं, क्या यह बहुत तेज़ी से हो सकता है, या यह सिर्फ WPF के लिए "ठेठ" है?

क्या इस उपकरण के लिए डिफ़ॉल्ट कैलेंडर नियंत्रण को तेज़ करने के लिए मैं कुछ कर सकता हूं?


Answers

मैं इसे अपडेट कर दूंगा क्योंकि मेरे पास इस नए नियंत्रण को पूरा करने का समय है, लेकिन अब तक मैंने खुद से साबित किया है कि खिड़की में बड़ी संख्या में नियंत्रण हो सकते हैं और अब भी इसे जल्दी से लोड हो गया है इस मामले में, 1 10 से कम सेकेंड में 1050 टेक्स्टब्लॉक्स (7 कॉलम * 6 पंक्तियां * 25 उपयोगकर्ता मेरे उपयोगकर्ता नियंत्रण का), और मेरी विंडो भार।

अभी तक मेरा सरल उपयोगकर्ता नियंत्रण है:

<UserControl x:Class="FastCalendar.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:FastCalendar"
             xmlns:vm="clr-namespace:FastCalendar.ViewModels"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300" Margin="5">
    <UserControl.Resources>
        <vm:MainViewModel x:Key="ViewModel" />
    </UserControl.Resources>
    <ItemsControl Width="180" Height="170" ItemsSource="{Binding Path=Days, Source={StaticResource ViewModel}}">
        <ItemsControl.ItemContainerStyle>
            <Style>
                <Setter Property="Grid.Row" Value="{Binding Path=Row}" />
                <Setter Property="Grid.Column" Value="{Binding Path=Column}" />
            </Style>
        </ItemsControl.ItemContainerStyle>

        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" Text="{Binding Path=Day}" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>

        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Grid ShowGridLines="True">
                    <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition />
                        <RowDefinition />
                        <RowDefinition />
                        <RowDefinition />
                        <RowDefinition />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                        <ColumnDefinition />
                        <ColumnDefinition />
                        <ColumnDefinition />
                        <ColumnDefinition />
                        <ColumnDefinition />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                </Grid>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>

    </ItemsControl>
</UserControl>

मैंने 25 लोगों को रैपपैनेल के अंदर रखा था, और यह 1 सेकेंड से कम समय में लोड होता है। मुझे अब भी अपने उपयोगकर्ता नियंत्रण में अधिक नियंत्रण और शैलियों को जोड़ने की आवश्यकता है, लेकिन मैं सोच रहा हूं कि यह अभी भी अंतर्निहित कैलेंडर नियंत्रण (मुझे उम्मीद है) की तुलना में अधिक तीव्र होगा।

ps- यहां तक ​​कि विंडो पर अपने उपयोगकर्ता नियंत्रण की 50 प्रतियां के साथ, यह लगभग 1 सेकंड में लोड होता है


प्रति जवाब नहीं, लेकिन इसे Window.Resources जोड़ना। Window.Resources ने मेरी मशीन में 50% लोड अवधि कम कर दी (जो अब 25 कैलेंडरों के लिए 1 सेकंड के अंतर्गत है)

    <Window.Resources>
        <Style TargetType="CalendarDayButton">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="CalendarDayButton">
                        <ContentPresenter ContentSource="Content" Margin="2"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

        <Style TargetType="Calendar">
            <Setter Property="CalendarDayButtonStyle" Value="{StaticResource {x:Type CalendarDayButton}}"/>
        </Style>
    </Window.Resources>

संपादित करें:

यह दृश्य परिवर्तन नियंत्रण की कार्यक्षमता को प्रभावित नहीं करता है सभी कैलेंडर दिवस के आइटम अभी भी Selectable , और आप Calendar.SelectedDate बाँध सकते हैं। Calendar.SelectedDate संपत्ति

कोई दृश्य संकेत नहीं है कि कोई आइटम चुना गया है, इसलिए दिन पर क्लिक करने से ऐसा कुछ नहीं लगता है

बस इसे अपने ControlTemplate में जोड़ें:

                <ControlTemplate TargetType="CalendarDayButton">
                    <ContentPresenter ContentSource="Content" Margin="2"/>

                    <ControlTemplate.Triggers>
                        <!-- Set The FontWeight to "Bold" when Selected -->
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="FontWeight" Value="Bold"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>

दृश्य प्रभाव जोड़ने के लिए आप इस ControlTemplate और इसके Triggers साथ खेल सकते हैं। यद्यपि टेम्पलेट अधिक जटिल को ध्यान में रखें, अब यह लोड करने के लिए ले जाएगा।


यह आपको एक विचार प्रदान करेगा कि स्नूप का उपयोग करके एक कैलेंडर बनाम एक बटन है। हां, हम बहुत अधिक कैलेंडर की उम्मीद करते हैं ताकि बहुत अधिक प्रतिपादन समय लगे। यदि आपको उनमें से बहुत से उपयोग करने की ज़रूरत है, तो मैं अपना स्वयं का बनाने का प्रयास करता हूं जो कि सरल और / या उन्हें वर्चुअलाइज करें

ये एक बटन है, 3 बच्चे ...

और एक कैलेंडर, 522 बच्चे ध्यान दें कि प्रत्येक CalendarButtons मैंने विस्तार नहीं किया है, अभी भी 9 बच्चे हैं


आपकी जरूरतों के आधार पर आप अधिक फीचर समृद्ध पुस्तकालयों के लिए जा सकते हैं। मैंने सुझाए गए अधिकांश / सभी समाधानों की कोशिश की, लेकिन सिर और कंधे से बाहर खड़ा हुआ एचटीएमएल एजिलिटी पैक था। यह एक बहुत क्षमाशील और लचीला पार्सर है।





c# wpf performance xaml calendar