1

アプリを実行すると、この例外が発生します。XAML に移動すると、デバッガーは次のメッセージで終了します。

DrawingSurfaceBackgroundGrid は、描画を開始する最初の要素である必要があります。

MainPage.xaml でボタンをクリックすると、この DirectX.xaml ファイルに移動します。DrawingSurfaceBackgroundGrid が唯一のコントロールであることを確認したので、最初の要素です。順番を間違えた?(ここには、私の App.xaml と MainPage.xaml も示されています)

DirectX.xaml

<phone:PhoneApplicationPage
    x:Class="GameWp8Dx.Hud.Tests.DirectX"
    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"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d"
    shell:SystemTray.IsVisible="True">

    <!--LayoutRoot is the root grid where all page content is placed-->
    <DrawingSurfaceBackgroundGrid x:Name="DrawingSurfaceBackground" Loaded="DrawingSurfaceBackground_Loaded">
    </DrawingSurfaceBackgroundGrid>

</phone:PhoneApplicationPage>

MainPage.xaml

<phone:PhoneApplicationPage
    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" 
    xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"
    xmlns:local="clr-namespace:GameWp8Dx"
    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" xmlns:ec="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions" 
    x:Class="GameWp8Dx.MainPage"
    mc:Ignorable="d"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible="True"
    local:TiltEffect.IsTiltEnabled="True"
    ApplicationBar="{StaticResource socialAppBar}"
    >

    <!--Transitions-->
    <toolkit:TransitionService.NavigationInTransition>
        <toolkit:NavigationInTransition>
            <toolkit:NavigationInTransition.Backward>
                <toolkit:TurnstileTransition Mode="BackwardIn"/>
            </toolkit:NavigationInTransition.Backward>
            <toolkit:NavigationInTransition.Forward>
                <toolkit:TurnstileTransition Mode="ForwardIn"/>
            </toolkit:NavigationInTransition.Forward>
        </toolkit:NavigationInTransition>
    </toolkit:TransitionService.NavigationInTransition>

<!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot">

        <phone:Panorama x:Name="test" HorizontalAlignment="Left" Height="686" VerticalAlignment="Top" Width="470"
            Title="{Binding Path=LocalizedResources.ApplicationTitle, Source={StaticResource ResourceKey=LocalizedStrings}}" TitleTemplate="{StaticResource MainPageTitleTemplate}" HeaderTemplate="{StaticResource MainPageHeaderTemplate}">

App.xaml

<Application
    x:Class="GameWp8Dx.App"
    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">

    <!--Application Resources-->
    <Application.Resources>

        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="CustomStyles.xaml"/>
            </ResourceDictionary.MergedDictionaries>

            <local:LocalizedStrings xmlns:local="clr-namespace:GameWp8Dx" x:Key="LocalizedStrings"/>

            <shell:ApplicationBar x:Key="inGameAppBar" IsVisible="True" IsMenuEnabled="False">
                <shell:ApplicationBarIconButton IconUri="/Assets/Icons/microphone.png" Text="record" Click="record_Click"/>
                <shell:ApplicationBarIconButton IconUri="/Assets/Icons/questionmark.png" Text="info"/>
                <shell:ApplicationBarIconButton IconUri="/Assets/Icons/map.png" Text="map" Click="map_Click"/>            
            </shell:ApplicationBar>
            <shell:ApplicationBar x:Key="socialAppBar" IsVisible="True" IsMenuEnabled="False">
                <shell:ApplicationBarIconButton IconUri="/Assets/Icons/appbar.twitter.png" Text="Tweet" Click="OnTweet"/>
                <shell:ApplicationBarIconButton IconUri="/Assets/Icons/appbar.twitter.bird.png" Text="Tweet" Click="OnTweetSharp"/>
                <shell:ApplicationBarIconButton IconUri="/Assets/Icons/appbar.facebook.png" Text="Share" Click="OnShare"/>
                <shell:ApplicationBarIconButton IconUri="/Assets/Icons/appbar.facebook.heart.png" Text="Like" Click="OnLike"/>
            </shell:ApplicationBar>
        </ResourceDictionary>
    </Application.Resources>

    <Application.ApplicationLifetimeObjects>
        <!--Required object that handles lifetime events for the application-->
        <shell:PhoneApplicationService
            Launching="Application_Launching" Closing="Application_Closing"
            Activated="Application_Activated" Deactivated="Application_Deactivated"/>
    </Application.ApplicationLifetimeObjects>
</Application>

アップデート

TransitionFrame() が原因であることがわかりました。PhoneApplicationPage() に戻し、DrawingSurfaceBackgroundGrid は問題なく動作するようになりました。

App.xaml.cs

private void InitializePhoneApplication()
{
    if (phoneApplicationInitialized)
        return;

    // Create the frame but don't set it as RootVisual yet; this allows the splash
    // screen to remain active until the application is ready to render.
    RootFrame = new TransitionFrame();
    //RootFrame = new PhoneApplicationFrame();
    RootFrame.Navigated += CompleteInitializePhoneApplication;

    // Handle navigation failures
    RootFrame.NavigationFailed += RootFrame_NavigationFailed;

    // Handle reset requests for clearing the backstack
    RootFrame.Navigated += CheckForResetNavigation;

    // Ensure we don't initialize again
    phoneApplicationInitialized = true;
}
4

1 に答える 1

3

ここで推測していますが、RootFrameを特別なTransitionFrameに変更しましたか?もしそうなら、私はそれがDrawingSurfaceBackgroundGridではうまく機能しないと思います。DrarwingSurfaceに変更して、この問題を解決できる可能性があります。ただし、DrawingSurfaceには、XAMLとの織り合わせに使用される中間の描画レイヤーのために、画面に表示されるすべてのDirectXコンテンツの余分なオーバードローがあります。したがって、フルページのD3DコンテンツでDrawingSurfaceを使用すると、パフォーマンスの問題が発生する可能性があります(HD解像度の画面ではさらに問題が発生します)。

問題を理解するために、DrawingSufaceBackgroundGridを使用してページから移動している場合に何が起こるかを考えてみてください。アニメートする必要がありますか?その場合、XAMLアニメーションをD3Dコンテンツに適用する必要がありますが、これはDrawingSurfaceBackgroundGridではサポートされていません。これはDrawingSurfaceでサポートされていますが、XAMLとの織り合わせに中間の描画レイヤーを使用するという大きなコストがかかります。

DirectXのパフォーマンスが悪いこととページ遷移がないことのトレードオフでは、ページ遷移がないことをオプトアウトすると思います。そうは言っても、アプリが異なれば妥協点も異なります。

別の考えとして、フルスクリーンD3Dが必要かどうかに基づいて、標準のPhoneApplicationFrameとTransitionFrameを切り替えることができる場合があります。私はそのようなものをテストしていません。

于 2012-11-15T19:57:13.137 に答える