何が起こっているのかを突き止めました - 加速度計と VideoBrushes を同時に実行すると、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 である四角形を配置することにしました。いくつかの Web サイトから見つけたコードを使用しましたが、すべて問題ないと思いました。これは、カメラからの 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 ディスプレイのフリーズを引き起こしている原因がわかりません。すべての関数にブレークポイントを設定しましたが、何も検出されませんでした。エラーメッセージはありません...ビデオがフリーズするだけです。
誰もこれに遭遇したことがありますか?私のデバイスと私がコーディングしているコンピューターの両方で発生します - エミュレーターのホワイトボックスが停止します。
わかりやすくするために、これはカメラがアプリで見ているものを示すことだけを目的としています。写真を撮ったり、ビデオを録画したりしているわけではありません。私はただこのショーを作っているだけです。ウィンドウを閉じるには、四角形をダブルタップして raw ビューを閉じます。