2013-07-02 2 views
0

Я пытаюсь изменить CameraType (FrontFacing/Primary) моей камеры в своем приложении.Windows Phone change CameraType

<Grid x:Name="LayoutRoot" Background="Transparent"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" /> 
     <ColumnDefinition Width="Auto" /> 
    </Grid.ColumnDefinitions> 

    <Canvas x:Name="viewfinderCanvas" Width="720" Height="480" 
       HorizontalAlignment="Left" > 

     <!--Camera viewfinder --> 
     <Canvas.Background> 
      <VideoBrush x:Name="viewfinderBrush" /> 
     </Canvas.Background> 

     <!-- Brackets for Touch Focus --> 
     <TextBlock 
      x:Name="focusBrackets" 
      Text="[ ]" 
      FontSize="40" 
      Visibility="Collapsed"/> 

    </Canvas> 

    <!--Button StackPanel to the right of viewfinder>--> 
    <StackPanel Grid.Column="1" > 
     <Button Content="Front" Name="btCameraType" Click="changeFacing_Clicked" FontSize="26" FontWeight="ExtraBold" Height="75"/> 
    </StackPanel> 

    <!--Used for debugging >--> 
    <TextBlock Height="40" HorizontalAlignment="Left" Margin="8,428,0,0" Name="txtDebug" VerticalAlignment="Top" Width="626" FontSize="24" FontWeight="ExtraBold" /> 
</Grid> 

И это код Сзади:

private void changeFacing_Clicked(object sender, RoutedEventArgs e) 
{ 
    if (cam.CameraType == CameraType.FrontFacing) 
     cam = new Microsoft.Devices.PhotoCamera(CameraType.Primary); 
    else 
     cam = new Microsoft.Devices.PhotoCamera(CameraType.FrontFacing); 
    viewfinderBrush.Dispatcher.BeginInvoke(delegate() 
    { 
     viewfinderBrush.SetSource(cam); 
    }); 
} 

Так что я на самом деле просто изменение CameraType, когда пользователь нажимает на кнопку. Проблема в том, что, когда пользователь несколько раз нажимает кнопку (так что 5 раз за 2 секунды), программа не может справиться с ней, и она перестает работать ... Любое решение о том, как избежать этой проблемы?

Я также попытался ен-/отключить кнопку, но я все еще могу нажать на кнопку ..

ответ

2

Проблема заключается в том, что когда пользователь нажимает несколько раз на кнопку (так как 5 раз в 2 секунды), программа не может справиться с этим, и он перестает работать

в моем опыте, я заметил, что PhotoCamera класс имеет тенденцию бросать много исключений, иногда по непонятным причинам ,

я мог бы получить некоторые downvotes, но вот то, что я хотел бы сделать: поставить код в try...catch блоке, например, так:

try 
{ 
    if (cam.CameraType == CameraType.FrontFacing) 
     cam = new Microsoft.Devices.PhotoCamera(CameraType.Primary); 
    else 
     cam = new Microsoft.Devices.PhotoCamera(CameraType.FrontFacing); 
    viewfinderBrush.Dispatcher.BeginInvoke(delegate() 
    { 
     viewfinderBrush.SetSource(cam); 
    }); 
} 
catch (Exception) { } 

Конечно, перед использованием камеры FrontFacing, вам нужно проверить, если устройство имеет один:

PhotoCamera.IsCameraTypeSupported(CameraType.FrontFacing) 

EDIT:
на основе комментариев, метод try..catch недостаточно. Вот еще уродливее решение, которое должно работать:

DateTime lastChange = DateTime.MinValue; 
private void changeFacing_Clicked(object sender, RoutedEventArgs e) 
{ 
    TimeSpan elapsedTime = DateTime.Now - lastChange; 
    if (elapsedTime.TotalMilliseconds < 2000) // If the last change occured less than 2 seconds ago, ignore it 
     return; 

    if (cam.CameraType == CameraType.FrontFacing) 
     cam = new Microsoft.Devices.PhotoCamera(CameraType.Primary); 
    else 
     cam = new Microsoft.Devices.PhotoCamera(CameraType.FrontFacing); 

    viewfinderBrush.Dispatcher.BeginInvoke(delegate() 
    { 
     viewfinderBrush.SetSource(cam); 
    }); 

    lastChange = DateTime.Now; 
} 
+0

Я также думал о попытке - поймать, но это тот же самый результат. Нажатие на кнопку (чтобы изменить CameraType) много раз заморозит приложение. Там нет исключения, нет «ошибки отладки» .... ничего. Он просто зависает/перестает работать (но приложение все еще открыто), а Visual Studio также не дает никаких ошибок или видит, что приложение заморожено, поэтому я должен остановить приложение вручную, нажав «Остановить отладку». --- Это действительно происходит, когда я нажимаю кнопку, когда новый CameraType не был установлен. – Rudi

+1

Вау ... в этом случае еще более уродливым решением было бы проверить, не произошло ли последнее изменение за X секунд до этого. –

+0

Да, это будет одно «уродливое» решение ...:/... Я также попытался использовать System.Threading.Thread.Sleep (2500) в 'finally {}', но CameraType изменяется ПОСЛЕ сна ? ... Не понимаю. Во всяком случае, я попытаюсь использовать метод с проверкой X секунд или, возможно, просто использовать Первичную камеру, если она не работает ... – Rudi

Смежные вопросы