在WPF / MVVM Light中,在屏幕上绘制矩形的最有效/最快的方法是什么 [英] What is the most efficient/fastest way to draw rectangles on the screen in WPF / MVVM Light

查看:111
本文介绍了在WPF / MVVM Light中,在屏幕上绘制矩形的最有效/最快的方法是什么的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  

以下代码在2D网格中绘制矩形。一切都工作得很好,除非它必须绘制超过50,000个正方形时非常慢。我知道它听起来像很多正方形,但我有相同的程序用`C ++ / Qt`编写,并且它的速度快了多少
,它在C#/ WPF中几乎瞬间抽出50,000个需要50秒。 



在WPF中有更好/更快的方法在屏幕上绘制矩形吗?

  

The following code draws rectangles in 2D grid. Everything is working fine except it is really slow when it has to draw more than 50,000 squares. I know it sounds like a lot of squares but I have the same program written in `C++/Qt` and it's a lot faster, it draws the 50,000 almost instantaneously wheres in C#/WPF it takes 50 seconds. 

Is there a better/faster way to draw rectangles on the screen in WPF?

有什么建议吗?

XAML

 <Window x:Class="DrawingRectanglesWithMvvmLight.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:ignore="http://www.galasoft.ch/ignore"
            mc:Ignorable="d ignore"
            Height="319"
            Width="453.333"
            Title="MVVM Light Application"
            DataContext="{Binding Main, Source={StaticResource Locator}}">
    
        <Window.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="Skins/MainSkin.xaml" />
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Window.Resources>
    
        <Grid x:Name="LayoutRoot" Margin="0,0,2,0" Height="194" VerticalAlignment="Top" Background="#FF3E7AAC">
    
            <ItemsControl ItemsSource="{Binding PartsGrid}" Height="200" Margin="5,0,10,-6">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <Canvas Background="#FFF1F0F0" Margin="10" />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Rectangle 
                            Width="{Binding Width}" 
                           Height="{Binding Height}" 
                           Margin="{Binding Margin}"
                           Fill="{Binding Fill}" />
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
    
            <Grid Margin="5,236,6,-69">
                <Button Content="Draw" Command="{Binding DrawCommand}" Margin="328,0,10,0" />
                <Button Content="Reset" Command="{Binding ResetCommand}" Margin="263,0,109,0" />
                <TextBox Text="{Binding Width}" RenderTransformOrigin="1.049,2.023" Margin="124,0,200,0"/>
                <TextBox Text="{Binding Height}" Margin="0,0,334,0"/>
            </Grid>
        </Grid>
    </Window>





型号



Model

    namespace MvvmLightTEST.Model
    {
        public class FSRectangle
        {
            public double Width { get; set; }
            public double Height { get; set; }
            public Thickness Margin { get; set; }
            public Brush Fill { get; set; }
        }
    }





$
ViewModel:






ViewModel:

    namespace DrawingRectanglesWithMvvmLight.ViewModel
    {
        public class MainViewModel : ViewModelBase
        {
            public ObservableCollection<FSRectangle> PartsGrid { get; } = new ObservableCollection<FSRectangle>();
    
            public RelayCommand DrawCommand { get; }
            public RelayCommand ResetCommand { get; }
    
            public double Width { get; set; }
            public double Height { get; set; }
    
            public MainViewModel(IDataService dataService)
            {
                DrawCommand = new RelayCommand(Draw);
                ResetCommand = new RelayCommand(Clear);
            }
    
            private void Draw()
            {
                Clear();
    
                int xParts = 250;
                int yParts = 200;
                for (int i = 0; i < xParts; i++) {
                    for (int j = 0; j < yParts; j++) {
                        FSRectangle part = new FSRectangle();
                        part.Width = Width;
                        part.Height = Height;
                        part.Margin = new Thickness((part.Width + 1) * i, (part.Height + 1) * j, 0, 0);
                        part.Fill = new SolidColorBrush(Color.FromArgb(170, 51, 51, 255));
                        PartsGrid.Add(part);
                    }
                }
            }
    
            private void Clear()
            {
                PartsGrid.Clear();
            }
        }
    }





b $ b




推荐答案

嗨fsdolphin,

Hi fsdolphin,

它好像你现在已经得到答案并解决了你的问题。

It seems that you have got answer and solved your issue now.

https://stackoverflow.com/questions/51295489/what-is-the-most-efficient-fastest-way-to -draw-rectangle-on-the-screen-in-wpf / 51295675

最好的问候,

Cherry


这篇关于在WPF / MVVM Light中,在屏幕上绘制矩形的最有效/最快的方法是什么的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆