gpt4 book ai didi

c# - 在 WPF/MVVM Light 的屏幕上绘制矩形最有效/最快的方法是什么

转载 作者:太空宇宙 更新时间:2023-11-03 20:55:11 44 4
gpt4 key购买 nike

以下代码在二维网格中绘制矩形。一切工作正常,只是当它必须绘制超过 50,000 个正方形时它真的很慢。我知道这听起来像很多正方形,但我有用 C++/Qt 编写的相同程序,而且速度快得多,它几乎可以立即绘制 50,000,而在 C#/WPF 中需要 50 秒。

有没有更好/更快的方法在 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>

类:

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

View 模型:

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();
}
}
}

用户界面

enter image description here

最佳答案

由于此用例的性能低下,因此未使用 MVVM。矩形是包含布局的 FrameworkElement,这是一种不缩放的功能 这在 SO 中讨论了很多次。

你可能要考虑

  • 使用 DrawingVisualContainerVisual 进行较低级别的渲染,没有布局开销
  • 没有 MVVM
  • 提前创建渲染视觉效果,而不是每次渲染

enter image description here

图片courtesy微软,未经许可使用。

MSDN 在 DrawingVisual 上有这样的说法

The DrawingVisual is a lightweight drawing class that is used to render shapes, images, or text. This class is considered lightweight because it does not provide layout or event handling, which improves its runtime performance. For this reason, drawings are ideal for backgrounds and clip art. The DrawingVisual can be used to create a custom visual object.

另见

关于c# - 在 WPF/MVVM Light 的屏幕上绘制矩形最有效/最快的方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51295489/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com