0

我正在使用 C++/XAML 和 DirectX 互操作 - SwapChainBackgroundPanel 编写 Windows 应用商店应用程序。

该应用程序基于模板“Split Page”。从每个列表视图项中,可以使用以下代码启动 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 页”。请注意,页面标题左侧有一个后退按钮。点击按钮返回第一页...

1.) 找到名为 pageTitle 的 TextBlock 元素并将 Text 属性更改为 Page 1。XAML 应如下所示:

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

2.) 将以下 XAML 作为第二个子元素添加到根网格。StackPanel 元素应该是包含后退按钮和页面标题的 Grid 的同级元素。

<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 属性更改为 Page 2。XAML 应如下所示:

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

4.) 将以下 XAML 作为第二个子元素添加到根网格。StackPanel 元素应该是包含后退按钮和页面标题的 Grid 的同级元素。

<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 方法更改为使用 BasicPage1 而不是 BlankPage 来调用 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 页”。请注意,页面标题左侧有一个后退按钮。单击按钮返回第一页。就是这样!希望它可以帮助你。

于 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 在目标不存在时不输出到渲染管道并抱怨(断开异常)。

于 2012-12-01T20:52:20.990 回答