请帮助我这个问题已经从我的生活中消磨了几个小时。所以我将我的游戏从XNA移植到silverlight,但我无法使.xaml代码正常工作。这个神秘的巨型紫色方块覆盖了屏幕并阻挡了运行游戏的DrawingSurface。这个错误是神秘的,让我绝对疯了,我仍然不知道它从哪里来的真实。下面是不同的.xaml版本来说明我的意思:
更糟糕的情况是,我只有正常的代码才能正常工作:
<Grid Background="white" x:Name="LayoutRoot" >
<DrawingSurface x:Name="myDrawingSurface" Draw="myDrawingSurface_Draw" VerticalAlignment="Center" HorizontalAlignment="Center" Height="600" Width="800" />
</Grid>
这会生成一个页面,它只是中间的游戏,完全被紫色方块完全阻挡(我不能发布超过2个链接,所以我不会链接图像,但我做了以后场景)。
在这个例子中,我将绘图表面移动到足以使其不覆盖整个游戏画面,以便您可以更好地了解我的意思:
<Grid Background="white" x:Name="LayoutRoot" >
<DrawingSurface x:Name="myDrawingSurface" Draw="myDrawingSurface_Draw" VerticalAlignment="Center" HorizontalAlignment="Center" Height="600" Width="800" Margin="434,0,-434,0" />
</Grid>
生成此图片:http://greygods.com/Silverlight3dApp3/purpleissue2.PNG
我得到的最好的解决方法是这个.xaml代码,它基本上以某种方式将紫色方块移开,我几乎不知道为什么这样可行或者紫色屏幕仍然来自哪里:
<Grid Background="white" x:Name="LayoutRoot" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0*" />
<ColumnDefinition Width="800*" />
</Grid.ColumnDefinitions>
<DrawingSurface x:Name="myDrawingSurface" Draw="myDrawingSurface_Draw" VerticalAlignment="Center" HorizontalAlignment="Center" Height="600" Width="800" Margin="0,0,0,0" Grid.Column="1" />
</Grid>
这会创建一个这样的页面,似乎可以修复它:http://greygods.com/Silverlight3dApp3/purpleissue3.PNG
现在的事情是,虽然我有这方面的工作,我不能做任何复杂的嵌套控制结构或任何东西,它总是回来(我想在网格外做一个视口,以便它放大浏览器大小,但该死的紫色方块回来了)。任何时候我想改变xaml代码该死的紫色方块回来了。请帮帮我。
其他提示:
- 画布控件对象会导致同样的问题。
-Viewbox不会导致问题(但似乎无法获得键盘焦点)。
编辑新信息:
这是我的整个xaml文件,它设法运行得足够好,我也可以在网格周围获得一个视图框。解决方法的策略主要是创建一个0行和列,并将您的实际视觉效果放在该行/列中我认为您甚至不需要该行也有0,只是列足够但我放了两个在这个例子中:
<UserControl x:Class="Silverlight3dApp.MainPage"
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"
Loaded="UserControl_Loaded"
mc:Ignorable="d" >
<Viewbox Stretch="Fill">
<Grid Background="white" x:Name="LayoutRoot" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0" />
<ColumnDefinition Width="800" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="0" />
<RowDefinition Height="500" />
</Grid.RowDefinitions>
<DrawingSurface x:Name="myDrawingSurface" Draw="myDrawingSurface_Draw" VerticalAlignment="Center" HorizontalAlignment="Center" Height="480" Width="800" Grid.Column="1" Grid.Row="1" />
</Grid>
</Viewbox>
</UserControl>
这看起来就像你期望的那样,我的游戏在480-800窗口中正常运行,然后延伸到包含整个浏览器,它很棒。
这也是我的xaml.cs文件:
namespace Silverlight3dApp
{
public partial class MainPage : UserControl
{
Game1 game;
Microsoft.Xna.Framework.GameTime gt;
readonly TimeSpan TargetElapsedTime = TimeSpan.FromTicks(TimeSpan.TicksPerSecond / 60);
readonly TimeSpan MaxElapsedTime = TimeSpan.FromTicks(TimeSpan.TicksPerSecond / 60); //was / 10
TimeSpan accumulatedTime;
public MainPage()
{
InitializeComponent();
}
private void myDrawingSurface_Draw(object sender, DrawEventArgs e)
{
TimeSpan elapsedTime = e.DeltaTime;
if (elapsedTime > MaxElapsedTime)
{
elapsedTime = MaxElapsedTime;
}
accumulatedTime += elapsedTime;
while (accumulatedTime >= TargetElapsedTime)
{
game.Update(e);
accumulatedTime -= TargetElapsedTime;
}
// Render scene
game.Draw(e);
e.InvalidateSurface();
}
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
if (GraphicsDeviceManager.Current.RenderMode != RenderMode.Hardware)
{
MessageBox.Show("Please activate enableGPUAcceleration=true on your Silverlight plugin settings, right click -> permissions -> select this game -> allow. Then refresh the page", "Warning", MessageBoxButton.OK);
}
else
{
game = new Game1();
game.Attach(LayoutRoot); //was LayoutRoot
gt = new Microsoft.Xna.Framework.GameTime();
game.Initialize(); // Create game
}
}
}
}