找出发生了什么——同时运行的加速度计和 VideoBrush 将冻结 VideoBrush。要解决此问题,请在启动 VideoBrush 之前停止加速度计
使用最少的代码(如下所述),它会在 VideoBrush 在应用程序上启动后大约 2 分 15 秒后可靠地崩溃。这是在 Windows Phone 7.5 应用程序的 Windows 7 模拟器上,使用 c# 和 Xaml。如果 VideoBrush 拉伸也设置为填充等,就会发生这种情况(这有一个 Silverlight 1.0 错误)
有关我如何得出此结论的故事,请查看下面的文字答案墙:)
为什么会这样?我不知道。也许有内存泄漏或什么?值得注意的是——这实际上不会使应用程序本身崩溃。您不会弹出任何异常。
重现问题的代码(创建一个名为 PhoneApp1 的新应用程序并自己尝试!):
Xaml 代码:
<phone:PhoneApplicationPage
x:Class="PhoneApp1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="800"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
shell:SystemTray.IsVisible="False">
<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<Rectangle x:Name="viewfinderCanvas" Width="480" Height="800" >
<Rectangle.Fill>
<VideoBrush x:Name="viewfinderBrush"/>
</Rectangle.Fill>
</Rectangle>
</Grid>
</phone:PhoneApplicationPage>
C#代码:
using System;
using System.Windows;
using Microsoft.Phone.Controls;
using Microsoft.Devices;
using Microsoft.Devices.Sensors;
namespace PhoneApp1
{
public partial class MainPage : PhoneApplicationPage
{
private Accelerometer AccelerometerSensor;
// Constructor
public MainPage()
{
InitializeComponent();
AccelerometerSensor = new Accelerometer();
AccelerometerStartup();
if ((PhotoCamera.IsCameraTypeSupported(CameraType.Primary) == true))
{
viewfinderCanvas.Visibility = Visibility.Visible;
var cam = new Microsoft.Devices.PhotoCamera(CameraType.Primary);
viewfinderBrush.SetSource(cam);
}
}
#region Accelerometer Startup Function
private void AccelerometerStartup()
{
try
{
if (AccelerometerSensor != null)
{
AccelerometerSensor.Start();
}
}
catch (AccelerometerFailedException)
{
}
catch (UnauthorizedAccessException)
{
}
}
#endregion
}
}
下面的原始问题:( 保留下面提到的代码,但由于没有连接加速度计,因此不会重现问题)
这是一个有趣的,我保证。
我决定在我的 wp7.5 应用程序中放置一个矩形,其填充属性是 VideoBrush。我使用了从几个网站上找到的代码,并认为一切都很好。直到我注意到相机中的 VideoBrush 会冻结...运行 6 到 40 秒。
困惑,我以为我的调度计时器干扰了相机。将它们注释掉以使其无法运行并不能解决问题。然后我尝试在应用程序中禁用我的广告。也没有修好。我禁用了可能在整个应用程序中呈现更新的所有内容(计时器、调度计时器、广告轮换、任何循环),但它仍然冻结。
我做了同样的事情,甚至从计算机上拔下我的设备,因为我在连接到计算机的情况下使用设备进行调试时打开 zune 可能会破坏事情。还是没有骰子。
我创建了一个新项目并复制粘贴了 VideoBrush 代码,它可以正常工作而不会冻结。
XAML 代码:
<Rectangle x:Name="viewfinderCanvas" Width="480" Height="800" Visibility="Collapsed" DoubleTap="viewfinderCanvas_DoubleTap">
<Rectangle.Fill>
<VideoBrush x:Name="videoBrush">
<VideoBrush.RelativeTransform>
<CompositeTransform x:Name="previewTransform"
CenterX=".5"
CenterY=".5" />
</VideoBrush.RelativeTransform>
</VideoBrush>
</Rectangle.Fill>
</Rectangle>
C#代码:
if ((PhotoCamera.IsCameraTypeSupported(CameraType.Primary) == true))
{
viewfinderCanvas.Visibility = Visibility.Visible;
var cam = new Microsoft.Devices.PhotoCamera(CameraType.Primary);
if (Orientation == PageOrientation.PortraitUp || Orientation ==
PageOrientation.PortraitDown || Orientation == PageOrientation.Portrait)
{
videoBrush.RelativeTransform =
new CompositeTransform() { CenterX = 0.5, CenterY = 0.5, Rotation = 90 };
}
videoBrush.SetSource(cam);
}
真的,我不知道是什么导致了 VideoBrush 显示冻结。我在每个函数上都设置了断点,但什么也没得到。不存在错误消息...视频只是冻结。
有没有人遇到过这个?它发生在我的设备和我编写代码的计算机上——模拟器的白盒刚刚停止。
为清楚起见——这样做的目的只是显示相机在应用程序中看到的内容——我不是在拍照或录制视频。我只是在做这个节目。要关闭窗口,用户将双击矩形以关闭原始视图。