Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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布局_C#_Wpf_Layout - Fatal编程技术网

C# 复杂纸牌游戏的WPF布局

C# 复杂纸牌游戏的WPF布局,c#,wpf,layout,C#,Wpf,Layout,作为我的第一个WPF项目,我正在尝试构建一个应用程序来玩类似于魔术聚会的纸牌游戏。我不清楚如何布置主游戏区。通过查看或,您可以看到一些类似于我尝试的示例。右侧的聊天/信息区域是独立的用户控件 纸牌必须保持其纵横比,每个游戏区域将以10列和两行纸牌开始。随着玩更多的牌,列数和/或行数可能会改变。每个播放器区域可能有不同数量的列和/或行。卡片可以重叠,也可以横向放置(轻敲)。所有区域的卡片大小应相同(尽管在某些区域可能会被裁剪)。卡片不需要精确地位于网格上(它们不一定会捕捉到网格) 当用户将鼠标悬停

作为我的第一个WPF项目,我正在尝试构建一个应用程序来玩类似于魔术聚会的纸牌游戏。我不清楚如何布置主游戏区。通过查看或,您可以看到一些类似于我尝试的示例。右侧的聊天/信息区域是独立的用户控件

纸牌必须保持其纵横比,每个游戏区域将以10列和两行纸牌开始。随着玩更多的牌,列数和/或行数可能会改变。每个播放器区域可能有不同数量的列和/或行。卡片可以重叠,也可以横向放置(轻敲)。所有区域的卡片大小应相同(尽管在某些区域可能会被裁剪)。卡片不需要精确地位于网格上(它们不一定会捕捉到网格)

当用户将鼠标悬停在卡上时,应使用动画将其扩展到更大的尺寸。一个玩家区域中的一张牌在展开时可能溢出到另一个玩家的区域中(但仅当鼠标悬停时)

考虑到这些需求,我很想使用一个从画布派生的大型用户控件,为每张卡使用图像对象(以及其他形状来描绘区域)。这意味着我将在OnRenderSizeChanged事件期间进行大量工作,以在画布中定位子项(手动布局)

由于自由形式的放置和重叠,使用网格对我来说似乎不可行

将游戏区域分解为较小的用户控件将利用WPF布局功能,但分解似乎会防止在鼠标悬停期间卡牌扩展到相邻的用户控件中,因此这似乎也不可行


除了一个基于画布的大型控件,还有更好的选择吗?在WPF中进行手动布局似乎是错误的,但我找不到替代方案。

我建议您查看一下。在爪哇我知道,但如果我要去建立一个纸牌游戏的路线。这就是我要做的。

网格内的许多画布可以帮助您,画布将允许内容在其边界之外渲染,只要您将ClipToBounds设置为false,并且与其他方案相比,您将获得更多对卡的精确放置的控制。您还将获得网格控件的强大功能,允许您根据需要添加和删除列和行(尽管您还必须动态添加和删除画布,但这并不太困难)

如果您担心重新缩放框时“卡”的内容会四处移动,请将其环绕在一个viewbox中。它将为您管理所有缩放,并确保您的卡使用尽可能多的不动产。或者,您可以使用RenderTransform,但其中许多可能会减慢程序的速度(专家:viewbox是否使用RenderTransforms进行操作?如果是,这一点是没有意义的)


为确保卡保持其纵横比,请确保将每个图像的拉伸属性设置为“均匀”,使它们都保持相同的大小可以通过指定主卡,并将所有后续卡的高度和宽度绑定到此原始卡来实现,尽管这有点混乱,不允许卡扩展。另一种解决方案是手动为每张卡设置单个大小,当您要扩展或收缩时对此设置动画。

对于复合应用程序ala Prism来说,这听起来是一个很棒的场景。它为实现区域、模块、在模块之间发送消息等提供了坚实的框架。通过查看屏幕截图,开发一个包含不同区域的外壳并将模块放入其中,可能会大大有助于您的布局自我,也许它们也可以是模块

退房:

下载包附带了一些特别好的示例,包括类似股票市场的应用程序和事件聚合器示例。

您说过:

将游戏区域分解为较小的用户控件将利用WPF布局功能,但分解似乎会防止在鼠标悬停期间卡牌扩展到相邻的用户控件中,因此这似乎也不可行

但这是不正确的。分解是绝对正确的方法,这不会阻止卡扩展到相邻的用户控件中。原因是您可以使用
RenderTransform
而不是
LayoutTransform
。请参阅Charles Petzold的,或者,将差异可视化。因为
>RenderTransform
在布局完成后应用,您的卡将能够扩展到其边界之外


考虑到分解是正确的方法,我会将您的各种卡片集合安排到一个
网格中,每个集合都是一个
ItemsControl
ItemsControl
应该将其
ItemsSource
属性绑定到某个集合,然后您可以提供一个d显示图像和任何其他信息。我会犹豫是否使用
画布
,因为这会限制您硬编码卡的位置(这是一个非常类似WinForms的解决方案,可以更优雅地解决问题)。利用WPF奇妙的布局引擎,使用嵌套的网格和项目控件创建动态布局。这将确保您的游戏板在任何分辨率下以及拉伸到各种尺寸时都看起来很好。

我不确定将卡作为模块是否非常有效,但除此之外,Prism将提供很大帮助。我一直在寻找我承认我有点迷路了。我不清楚这会有什么帮助,因为调整窗口大小时,协调区域之间的卡大小似乎很棘手。在调整窗口大小时,让一张卡溢出其区域并覆盖另一个区域