2012-10-03 5 views
0

Kinect.Toolbox 마우스 및 자기 제어 기능을 사용하고 있습니다. 단일 페이지에서 완벽하게 작동합니다. 그러나 내가 다른 페이지를 탐색 할 때 오류가 발생합니다. InvalidOperationException 사용자 코드에서 처리되지 않음 - 지정된 시각적 요소가이 시각적 요소의 조상이 아닙니다. 이 MouseController.cs 라인 (158)에 발생합니다페이지를 탐색 할 때 Kinect 도구 상자 및 자기 제어

var position = element.TransformToAncestor(rootVisual).Transform(new Point(0, 0)); 

을 내가 이전 페이지에서 자기 controlls이 목록에 여전히 그 문제를 일으키는 것을 이해 디버깅과 함께. 그래서 나는하여 다음 페이지로 이동하기 전에를 삭제 시도 :

MouseController.Current.MagneticsControl.Clear(); 

그러나, 여전히 같은 오류가 발생합니다. 탐색하기 전에 목록을 지우면 같은 페이지에서 여전히 오류가 발생하고 magneticControls 목록이 비어집니다. 탐색 후 지우면 오류가 발생하지 않지만 자기 제어는 인식되지 않습니다. 그들은 목록에서 삭제됩니다. 누구든지이 솔루션을 가지고 있습니까? 그리고이 목록을 지울 정확한 위치는 어디입니까? 내가 자기 컨트롤이 곳에있다

은 XAML입니다 :
<Grid> 
    <Button Content="1" local:MagneticPropertyHolder.IsMagnetic="True" Click="Button_Click"/> 
</Grid> 

및 Button_Click에 나는 또한 약간의 자기 설정 제어가 다른 페이지로 이동

:

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     MouseController.Current.MagneticsControl.Clear(); 
     keyboard pageKeyboard = new keyboard(); 
     NavigationService navigationService = NavigationService.GetNavigationService(this); 
     navigationService.Navigate(pageKeyboard); 
    } 

답변

0

OK, 내 문제를 해결 이렇게 : 비주얼 트리가 여전히 조립되는 동안 변환기가 호출되기 때문에이 문제가 발생한다는 것을 이해했습니다. 따라서 비주얼은 아직 윈도우의 자손이 아닙니다. 비주얼 트리가 이미 구축되면 변환 작업을 수행하는 것과 같은 몇 가지 솔루션이 있습니다. Dispatcher.BeginInvoke (DispatcherPriority.Render, ...)를 사용하여 Dispatcher 콜백을 등록하고 콜백 내부에서 작업을 수행하면됩니다.

소스 코드로 들어가기를 원하지 않았고 복잡한 고급 기능을 수행하기 위해 WPF로는 아직 충분하지 않았기 때문에 아마도 내 솔루션을 사용했을 것입니다. 아마도 내 솔루션이 아닙니다. 자기 제어 목록을 지우는 대신 XAML에서 설정하는 대신 프로그래밍 방식으로 자기 제어 장치를 설정하기로 결정했습니다. 이 방법으로 나는 시각적 트리가 이미 만들어 졌을 때 자기 제어를 설정하도록 할 수 있습니다. 그래서, PAGE_LOADED 이벤트에 내가 자기 controlls를 설정하고 (이 마지막 부분은 필수적인지를 확실하지 않음) 자기 설정 제어리스트로 밀어 :

private void Page_Loaded(object sender, RoutedEventArgs e) 
{ 
    foreach (Button btn in MagneticButtons) 
     { 
      btn.SetValue(MagneticPropertyHolder.IsMagneticProperty, true); 
      MouseController.Current.MagneticsControl.Add(btn); 
     } 
} 

을 내 유일한 자기 컨트롤 버튼입니다, 당신은 다른 controlls을 설정할 수 있습니다 이렇게. 내가 다른 페이지로 페이지를 탐색하고 때 나는 모든 자기 버튼 설정을 해제하고 자기 제어 목록에서 제거 :

: 윈도우의 컨트롤을 얻거나 페이지가 당신이 사용할 수있는 경우

foreach (Button btn in MagneticButtons) 
{ 
    btn.SetValue(MagneticPropertyHolder.IsMagneticProperty, false); 
    MouseController.Current.MagneticsControl.Remove(btn); 
} 

private IEnumerable<Button> MagneticButtons = FindVisualChildren<Button>(this); 
:

그리고 예를 들어 버튼을 취득하기위한 내 경우에는

public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject 
    { 
     if (depObj != null) 
     { 
      for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
      { 
       DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 
       if (child != null && child is T) 
       { 
        yield return (T)child; 
       } 

       foreach (T childOfChild in FindVisualChildren<T>(child)) 
       { 
        yield return childOfChild; 
       } 
      } 
     } 
    }