0

DirectX 相互運用機能を備えた C++/XAML を使用して Windows ストア アプリを作成しています - SwapChainBackgroundPanel。

アプリケーションは、テンプレート「分割ページ」に基づいています。各リスト ビュー アイテムから、次のコードを使用して DirectX ページを起動できます。

Window::Current->Content = ref new MyD3Components::DirectXPage();
Window::Current->Activate();

これは正常に機能しており、DirectX ページが開き、非常にうまく機能します。

ユーザーが戻って「分割ページ」を表示して別のDirectXページを選択できるようにするボタンをアプリバーに配置したいと思います。これはまだ達成できていません。

私が試したいくつかのことの中で、以下は私の意見にとって最も論理的なものです。ユーザーが最後のページに戻りたい場合、「Platform::DisconnectedException」が発生します。

Windows::UI::Xaml::Controls::Frame^ rootFrame = SDL::App::GetRootFrame();

Window::Current->Content = rootFrame;
Window::Current->Activate();

提案やより良い解決策があるかどうかを確認してください。

4

2 に答える 2

1

ここにあなたの質問のサンプル例があります:

私が作成しているもの:2ページ... 1ページに(2ページに移動)リンクがあります...それをクリックすると、上部に「2ページ」と表示された2番目のページが表示されます。ページタイトルの左側に戻るボタンがあることに注意してください。ボタンをクリックして最初のページに戻ります...

1.)pageTitleという名前のTextBlock要素を見つけて、TextプロパティをPage1に変更します。XAMLは次のようになります。

<TextBlock x:Name="pageTitle" Grid.Column="1" Text="Page 1" 
       Style="{StaticResource PageHeaderTextStyle}"/>

2.)次のXAMLを2番目の子要素としてルートグリッドに追加します。StackPanel要素は、戻るボタンとページタイトルを含むグリッドの兄弟である必要があります。

<StackPanel Grid.Row="1"
        Margin="120,0,120,60">
 <HyperlinkButton Content="Click to go to page 2" Click="HyperlinkButton_Click_1"/>
</StackPanel>

3.)BasicPage2.xamlに次の変更を加えます。pageTitleという名前のTextBlock要素を見つけて、TextプロパティをPage2に変更します。XAMLは次のようになります。

<TextBlock x:Name="pageTitle" Grid.Column="1" Text="Page 2" 
       Style="{StaticResource PageHeaderTextStyle}"/>

4.)次のXAMLを2番目の子要素としてルートグリッドに追加します。StackPanel要素は、戻るボタンとページタイトルを含むグリッドの兄弟である必要があります。

<StackPanel Grid.Row="1"
    Margin="120,0,120,60">
  <TextBlock HorizontalAlignment="Left" Name="tb1" Text="Hello World!"/>
</StackPanel>

5.)BasicPage1.Xaml.csのBasicPage1クラスに次のコードを追加します

private void HyperlinkButton_Click_1(object sender, RoutedEventArgs e)
{
this.Frame.Navigate(typeof(BasicPage2));
}

6.)新しいページを準備したので、アプリの起動時にBasicPage1を最初に表示する必要があります。app.xaml.csを開き、OnLaunchedメソッドを変更して、BlankPageの代わりにBasicPage1を使用してFrame.Navigateを呼び出します。OnLaunchedメソッド全体は次のようになります。

protected override void OnLaunched(LaunchActivatedEventArgs args)
{
// Create a Frame to act navigation context and navigate to the first page
var rootFrame = new Frame();
rootFrame.Navigate(typeof(BasicPage1));

// Place the frame in the current window and ensure that it is active
Window.Current.Content = rootFrame;
Window.Current.Activate();
}

これで、アプリをテストする準備が整いました。アプリを起動し、[クリックしてページ2に移動]というリンクをクリックします。上部に「ページ2」という2番目のページが表示されます。ページタイトルの左側に戻るボタンがあることに注意してください。ボタンをクリックして最初のページに戻ります。それでおしまい!それがあなたを助けることを願っています。

于 2012-12-01T18:16:27.017 に答える
1

少し試行錯誤した後、私は自分の質問に答える立場にいます。私がする必要があったのは、CompositionTarget からレンダリング コールバックを削除することだけだったようです。

以下のように追加されました。

m_eventToken = CompositionTarget::Rendering::add(ref new Windows::Foundation::EventHandler<Object^>(this, &DirectXPage::OnRendering));    

現在のウィンドウを置き換えてアクティブ化する前に、以下を呼び出しました。

CompositionTarget::Rendering::remove(m_eventToken);

これにより、DirectX がレンダリング パイプラインに出力されず、ターゲットが存在しない場合にエラー (disconnectedexception) が表示されなくなりました。

于 2012-12-01T20:52:20.990 に答える