Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF&x27;地图';控制使用画布显示大量位图图像_C#_Wpf_Wpf Controls - Fatal编程技术网

C# WPF&x27;地图';控制使用画布显示大量位图图像

C# WPF&x27;地图';控制使用画布显示大量位图图像,c#,wpf,wpf-controls,C#,Wpf,Wpf Controls,我正在用基底解析minecraft文件数据。地雷船由“块”组成,块由块组成。所以我有一张不同16x16瓷砖的精灵纸。我在WPF中使用一个裁剪的位图来找到合适的图形平铺,以组成地图的一部分。然后我将WPF中的Image()控件指定为“source”,这是我的裁剪位图。最后,我做myCanvas.Children.Add(myImage)。。。问题是,在画布中放置了大约30个图像后,应用程序的速度会减慢到爬行状态。这是一个问题,因为典型的地雷船地图会有成百上千的图像。有没有更好的方法来绘制大量位图数

我正在用基底解析minecraft文件数据。地雷船由“块”组成,块由块组成。所以我有一张不同16x16瓷砖的精灵纸。我在WPF中使用一个裁剪的位图来找到合适的图形平铺,以组成地图的一部分。然后我将WPF中的Image()控件指定为“source”,这是我的裁剪位图。最后,我做myCanvas.Children.Add(myImage)。。。问题是,在画布中放置了大约30个图像后,应用程序的速度会减慢到爬行状态。这是一个问题,因为典型的地雷船地图会有成百上千的图像。有没有更好的方法来绘制大量位图数据?我喜欢使用图像控件,因为这样我就可以在地图上放置工具提示并使其具有交互性。但我承认,图像控件可能要贵得多,拥有数千个图像控件可能不起作用。这是我的密码。 (这只解析特定值的分幅,因此如果id==9)

var-mapTiles=(BitmapImage)FindResource(“mapTiles”);
CroppedBitmap-waterImage=新的CroppedBitmap(mapTiles,新的Int32Rect(352,48,16,16));
CroppedBitmap grassImage=新的CroppedBitmap(mapTiles,新的Int32Rect(0,0,16,16));
foreach(chunkManager中的ChunkRef chunk)
{
countOfTiles++;
对于(int x=0;x 0&&chunk.Z>0)
{
var block=chunk.Blocks.GetBlock(x,高度-1,z);
如果(block.ID==9)
{
//352, 48
图像=新图像();
image.Source=waterImage;
worldMap.Children.Add(图像);
Canvas.SetTop(图像,(chunk.X+X)*16);
Canvas.SetLeft(图像,(chunk.Z+Z)*16);
image.ToolTip=countOfTiles.ToString();
}

您可以使用ImageBrush,而不是使用较重的图像:

// use ImageBrush's instead
var waterImage = new ImageBrush(new CroppedBitmap(...));
var grassImage = new ImageBrush(new CroppedBitmap(...));

waterImage.Freeze();
grassImage.Freeze();
后来:

if (block.ID == 9)
{
    var water = new Rectangle
    {
        Width = 16,
        Height = 16,
        Fill = waterImage
    };
    worldMap.Children.Add(water);
    Canvas.SetTop(water, (chunk.X + x) * 16);
    Canvas.SetLeft(water, (chunk.Z + z) * 16);
    water.ToolTip = countOfTiles.ToString();
}

如果我不使用冻结,我就无法让一个具有100x100平铺世界的测试应用程序正确显示。当我冻结每个画笔时,我可以让地图无缝显示到大约300x300。在1000x1000时,它几乎不会加载,但此时你需要加载,因为UI无法优雅地处理那么多UIElement。

非常感谢!这太令人惊讶了一个更正:我使用了“填充”而不是矩形上的“背景”属性。我认为这只是一个输入错误,因为我找不到背景属性。你是对的,这是一个输入错误。它甚至值得设计一个轻量级的
控件
,它封装了块的一些子集。Al因此,在世界范围内的某一点上,你必须移动到虚拟化面板。我很好奇你所说的虚拟化视图是什么意思。你能提供一些关于这个的链接或其他信息吗?再一次,非常感谢你的输入!基本上,它将控件的子控件抽象出来,以便使用不同的绑定数据重用较少的UI元素ata而不是数千个单独的UI元素。
if (block.ID == 9)
{
    var water = new Rectangle
    {
        Width = 16,
        Height = 16,
        Fill = waterImage
    };
    worldMap.Children.Add(water);
    Canvas.SetTop(water, (chunk.X + x) * 16);
    Canvas.SetLeft(water, (chunk.Z + z) * 16);
    water.ToolTip = countOfTiles.ToString();
}