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>

アプリケーションを実行すると、IDE であるかどうかに関係なく、ウィンドウが開くまでに 5 秒かかります。開くと、(サイズを変更すると)すばやく再描画され、すべてがきびきびと見えます。

私の PC は最速ではありません: AMD デュアル コア 2.3GHz、2GB RAM、XP 32 ビット OS、オンボード ビデオ。

カレンダーの代わりに 25 個のボタンを配置でき、1 秒未満で読み込まれます。

次のように、MS Outlook カレンダーの日ビューで小さな月のカレンダーのようなものを作成しようとしています。

ここに画像の説明を入力

したがって、WrapPanel を使用して、サイズ変更時に Calendar コントロールを追加/削除できると考えていました。25 は必要ないかもしれませんが、9 または 12 であっても、思ったよりも遅くなります (このような 18 のカレンダーを 1 秒未満で表示する従来の Win32 アプリがあります)。

私の質問は次のとおりです。

カレンダー コントロールが遅いのは特定の設計が原因ですか? 設計が悪いのか、単にこの用途向けに設計されていないのか、それとも大量のデータ/コントロール/情報を表示しようとしているために単に遅いのでしょうか?

独自のコントロールを作成するのに苦労した場合、良いデザインを使用すると仮定すると (一般的なアイデアを歓迎します)、はるかに高速になる可能性がありますか、それとも WPF の「典型的な」ものですか?

この用途でデフォルトの Calendar コントロールを高速化するためにできることはありますか?

4

3 に答える 3

6

それ自体は答えではありませんが、これを追加する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>

編集:

この視覚的な変更は、コントロールの機能には影響しません。Calendar の Day アイテムはすべてまだSelectableであり、プロパティをバインドでき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て、視覚効果を追加することができます。ただし、テンプレートが複雑になるほど、読み込みに時間がかかることに注意してください。

于 2013-08-30T20:58:30.093 に答える
0

この新しいコントロールを完成させる時間があるので、これを更新しますが、これまでのところ、ウィンドウに多数のコントロールを配置しても、すばやく読み込むことができることを証明しました。この場合、1050 個の TextBlocks (7 列 * 6 行 * ユーザー コントロールの 25 インスタンス) で、ウィンドウは 1 秒未満で読み込まれます。

これまでの私の単純なユーザーコントロールは次のとおりです。

<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>

WrapPanel 内に 25 個配置したところ、1 秒もかからずに読み込まれました。ユーザー コントロールにさらにコントロールとスタイルを追加する必要がありますが、組み込みの Calendar コントロールよりもはるかに高速になると考えています (期待しています)。

ps-ウィンドウにユーザー コントロールのコピーが 50 個あっても、約 1 秒で読み込まれます。

于 2013-08-30T23:53:44.100 に答える