2014-01-24 19 views
0

我有一项功能,允许用户在设备上的FrontFacing和主摄像头之间切换。在切换过程中,我想向用户显示一个ProgressBar和TextBlock。出于某种原因,我不能让这些在视图中显示,并且在切换过程中,显示​​的唯一的事情就是nonrotated的VideoBrush的冻结图像如何在VideoBrush上显示ProgressBar

MainPage.xaml中

<Grid.RowDefinitions> 
      <RowDefinition Height="72"/> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="68"/> 
      <RowDefinition Height="72"/> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="72"/> 
      <ColumnDefinition Width=".33*"/> 
      <ColumnDefinition Width=".33*"/> 
      <ColumnDefinition Width=".33*"/> 
      <ColumnDefinition Width="72"/> 
     </Grid.ColumnDefinitions> 

     <!-- Center this on the screen --> 
     <Canvas x:Name="VideoCanvas" Grid.Row="0" Grid.RowSpan="4" Grid.ColumnSpan="5" 
       VerticalAlignment="Center" HorizontalAlignment="Center"> 
      <Canvas.Background> 
       <VideoBrush x:Name="videoBrush"> 
        <VideoBrush.RelativeTransform> 
         <CompositeTransform x:Name="videoBrushTransform" 
             CenterX="0.5" CenterY="0.5"/> 
        </VideoBrush.RelativeTransform> 
       </VideoBrush> 
      </Canvas.Background> 
     </Canvas> 

     ... 

     <StackPanel Grid.Row="1" Grid.ColumnSpan="5" VerticalAlignment="Center"> 
      <ProgressBar x:Name="progressIndicator" IsIndeterminate="False" Background="Transparent"/> 
      <TextBlock x:Name="modeChangeTextBlock" Margin="12" 
        VerticalAlignment="Top" HorizontalAlignment="Center" FontSize="28" 
        Foreground="{StaticResource PhoneSubtleBrush}"/> 
     </StackPanel> 

MainPage.xaml中的.cs

void sensor_Click(object sender, EventArgs e) 
    { 
     CameraType type = camera.CameraType; 

     //Switch to other camera, if available 
     if(type == CameraType.Primary) 
     { 
      if(PhotoCamera.IsCameraTypeSupported(CameraType.FrontFacing) == true) 
      { 
       ShowProgress("Switching cameras"); 
       UninitializeCamera(); 
       InitializeCamera(CameraType.FrontFacing); 
       HideProgress(); 
      } 
     } 
     else 
     { 
      if(PhotoCamera.IsCameraTypeSupported(CameraType.Primary) == true) 
      { 
       ShowProgress("Switching cameras"); 
       UninitializeCamera(); 
       InitializeCamera(CameraType.Primary); 
       HideProgress(); 
      } 
     } 
    } 

    ... 

    private void ShowProgress(String msg) 
    {    
     progressIndicator.IsIndeterminate = true; 
     modeChangeTextBlock.Text = msg; 
     //progressIndicator.Visibility = Visibility.Visible; 
    } 

    private void HideProgress() 
    { 
     progressIndicator.IsIndeterminate = false; 
     modeChangeTextBlock.Text = ""; 
     //progressIndicator.Visibility = Visibility.Collapsed; 
    } 

编辑*加入下面现有XAML代码用于测试

<Rectangle x:Name="cameraSwitchingFill" Visibility="Visible" 
        Fill="{StaticResource SelfiePageBackgroundColorBrush}" 
        Grid.Row="0" Grid.Column="0" Grid.RowSpan="4" Grid.ColumnSpan="5"/> 

     <StackPanel Grid.Row="1" Grid.ColumnSpan="5" VerticalAlignment="Center"> 
      <ProgressBar x:Name="progressIndicator" IsIndeterminate="True" Background="Transparent"/> 
      <TextBlock x:Name="modeChangeTextBlock" Margin="12" 
        VerticalAlignment="Top" HorizontalAlignment="Center" FontSize="28" 
        Foreground="{StaticResource PhoneSubtleBrush}" Text="test"/> 
     </StackPanel> 

添加的编辑尝试了解在摄像头切换过程中未显示进度条的原因。设置屏幕上显示的所有内容,当第一次导航到这个页面时,我所看到的只有cameraSwitchingFill矩形,没有ProgressBar或TextBlock(尽管在设计器中我可以看到这些)。在切换摄像头时(如预期的那样),我看到矩形但没有ProgressBar或TextBlock。

我然后回到未示出的编辑和修改

空隙sensor_Click(对象发件人,EventArgs的) { //切换到其他相机(如果可用) CameraType类型= camera.CameraType;

 if(type == CameraType.Primary) 
     { 
      if(PhotoCamera.IsCameraTypeSupported(CameraType.FrontFacing) == true) 
      { 
       ShowProgress(AppResources.CapturePage_SwitchingCameras); 
       cameraSwitchingFill.Visibility = Visibility.Visible; 
       UninitializeCamera(); 
       InitializeCamera(CameraType.FrontFacing); 
       cameraSwitchingFill.Visibility = Visibility.Collapsed; 
       HideProgress(); 
      } 
     } 
     else 
     { 
      if(PhotoCamera.IsCameraTypeSupported(CameraType.Primary) == true) 
      { 
       ShowProgress(AppResources.CapturePage_SwitchingCameras); 
       cameraSwitchingFill.Visibility = Visibility.Visible; 
       UninitializeCamera(); 
       InitializeCamera(CameraType.Primary); 
       cameraSwitchingFill.Visibility = Visibility.Collapsed; 
       HideProgress(); 
      } 
     } 
    } 

所以结果是,当我永久使屏幕上的矩形和进度显示,只显示矩形,直到第一台相机开关点击事件发生,之后无论是矩形或进度条会显示。此外,即使矩阵和进度条在xaml中的videobrush实现下声明,在此期间被设置为可见,但切换期间冻结的图像仍保留在屏幕上。

+0

这只是一个想法 - 你可以使用覆盖 –

回答

0

愿这能帮助你。试试这个

<Grid> 
     <Grid.RowDefinitions> 
     <RowDefinition Height="*"/>      
     </Grid.RowDefinitions> 

     <!-- Center this on the screen --> 
        <Canvas x:Name="VideoCanvas" Grid.Row="0" > 
         <Canvas.Background> 
          <VideoBrush x:Name="videoBrush" > 
           <VideoBrush.RelativeTransform> 
            <CompositeTransform x:Name="videoBrushTransform" 
                CenterX="0.5" CenterY="0.5"/> 
           </VideoBrush.RelativeTransform> 
          </VideoBrush> 
         </Canvas.Background> 
        </Canvas> 
       <StackPanel Grid.Row="0" VerticalAlignment="Center"> 
     <TextBlock x:Name="modeChangeTextBlock" Margin="12" VerticalAlignment="Top" HorizontalAlignment="Center" FontSize="28" Foreground="{StaticResource PhoneSubtleBrush}"/> 
     <ProgressBar x:Name="progressIndicator" IsIndeterminate="False" Grid.RowSpan="4" /> 
      </StackPanel> 
    </Grid> 
+0

不幸的是,没有工作。也许你可以根据我的编辑提供一些建议? – Matthew

0

声明没有错。它只是你发布声明的顺序是不正确的。

在网格中的重叠是通过在您撰写XAML

在给定的包含文本块和进度Panel的XAML被放置在第一位置,然后将含有所述的VideoBrush面板来自哪个重叠第一的顺序进行面板(隐形背后的主要原因)。所以,如果您希望面板可见,只需在包含该视频面板的面板下方声明它即可。这个区域可以帮助具有进度条的面板与包含视频刷的面板重叠。

,因此更新的声明,现在变成

<Grid.RowDefinitions> 
      <RowDefinition Height="72"/> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="68"/> 
      <RowDefinition Height="72"/> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="72"/> 
      <ColumnDefinition Width=".33*"/> 
      <ColumnDefinition Width=".33*"/> 
      <ColumnDefinition Width=".33*"/> 
      <ColumnDefinition Width="72"/> 
     </Grid.ColumnDefinitions> 

     <!-- Center this on the screen --> 


      <Canvas x:Name="VideoCanvas" Grid.Row="0" Grid.RowSpan="4" Grid.ColumnSpan="5"> 
      <Canvas.Background> 
       <VideoBrush x:Name="videoBrush" > 
        <VideoBrush.RelativeTransform> 
         <CompositeTransform x:Name="videoBrushTransform" 
             CenterX="0.5" CenterY="0.5"/> 
        </VideoBrush.RelativeTransform> 
       </VideoBrush> 
      </Canvas.Background> 
     </Canvas> 

     <StackPanel Grid.Row="1" Grid.ColumnSpan="5" VerticalAlignment="Center"> 
      <ProgressBar x:Name="progressIndicator" IsIndeterminate="True" Background="Transparent"/> 
      <TextBlock x:Name="modeChangeTextBlock" Margin="12" Text="loading" 
        VerticalAlignment="Top" HorizontalAlignment="Center" FontSize="28" 
        Foreground="White"/> 
     </StackPanel> 

希望这有助于。

+0

谢谢。这实际上是我最初的声明,但没有奏效。我把它转回到你如何陈述。我注意到,在相机之间切换时,一旦按下按钮,并且在一个相机未初始化而另一个相机初始化的过程中,屏幕上会显示非旋转的VideoBrush的冻结图像。我不认为这会叠加StackPanel与ProgressBar和TextBlock与你的实现,但我没有看到屏幕上的任何东西。 – Matthew

+0

好吧,它的奇怪,然后尝试在photocamera对象的初始化事件上调用HideProgress()(假设没有在UninitializeCamera(),InitializeCamera()中重新定位xaml) –

+0

不幸的是,也没有工作。我在xaml中将VideoCanvas居中,不过因为在旋转视频刷时它不居中。 – Matthew