2012-10-03 70 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,我解決我的問題像這樣:我明白這個問題是由於轉換器在視覺樹仍然被組裝時被調用而引起的,因此你的Visual不是Window的後代。有一些解決方案可以在你的視覺樹已經建好之後進行轉換。這是通過使用Dispatcher.BeginInvoke(DispatcherPriority.Render,...)註冊Dispatcher回調並在回調中完成您的工作完成的。因爲我不想深入到源代碼中,並且我對WPF執行的高級複雜工作仍然不夠好,所以我使用了我自己的解決方案,這可能不是有史以來最好的解決方案。我沒有清除磁控制列表,而是決定以編程方式設置我的磁控制器,而不是將它們設置在XAML中。通過這種方式,我可以確保當視覺樹已經建好時,我設置了磁控制器。所以,在PAGE_LOADED事件中,我設定的磁controlls,並將它們推入磁控制研究列表(不知道這最後一部分是neccessary):

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); 
} 

用於獲取控制在窗口或頁面,您可以使用此:

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; 
       } 
      } 
     } 
    } 

在我的情況下獲得的按鈕,例如:

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