2010-01-29 8 views
0

J'ai un UserControl dans Silverlight 3.Glisser/Déposer Problème Dans SL3

La grille de LayoutRoot contient un enfant, une grille, qui est composé de trois colonnes et deux lignes.

est inférieure à la mise en page:

<Grid x:Name="LayoutRoot" Background="White"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="Auto"/> 
     </Grid.ColumnDefinitions> 

     <Grid x:Name="NavigationGrid" Grid.RowSpan="2" Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
      <!-- Content placed here --> 
     </Grid> 
     <Border Background="Transparent" Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="0" BorderBrush="Black" BorderThickness="0,0,0,0" Height="38" HorizontalAlignment="Stretch" Width="Auto"> 
      <!-- Content placed here --> 
     </Border> 
     <Border Background="Transparent" Grid.Column="2" Grid.Row="1" Grid.RowSpan="2" BorderBrush="Black" BorderThickness="0,0,1,1" Height="Auto" VerticalAlignment="Stretch" Width="38"> 
      <!-- Content placed here --> 
     </Border> 
     <Border Grid.Row="1" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="Auto" Background="White" BorderBrush="Black" BorderThickness="0,0,1,1" Width="Auto"> 
      <!-- Content placed here --> 
     </Border> 
    </Grid> 
</Grid> 

Je fonctionnalité qui utilise un Adorner. L'adorateur s'attache à un élément de cadre spécifié.

Cette fonctionnalité est appelée lorsque l'utilisateur clique sur un bouton situé dans le coin supérieur droit de la grille nommée NavigationGrid. Le bouton contient une icône d'une punaise. Cette fonctionnalité supprime la grille NavigationGrid des enfants de ses parents et l'ajoute aux enfants de la grille LayoutRoot. L'adorner permet à l'utilisateur de pouvoir faire glisser la grille autour de l'écran. Si l'utilisateur clique à nouveau sur le bouton de la punaise, la fonctionnalité prévue est que la grille soit retirée des enfants LayoutRoot et ajoutée aux enfants de ses parents d'origine, avec Grid.Column, Grid.RowSpan, etc. . valeurs. Le problème que je rencontre est lorsque la grille NavigationGrid est initialement supprimée des enfants de ses parents, tous les autres éléments dans la grille redimensionner etc. C'est ok, car c'est ce que je voulais. Mais, lorsque la grille est replacée dans les enfants de ses parents, son emplacement n'est pas le même qu'à l'origine. J'ai vérifié la propriété Margin, et il est mis à 0. Donc, parce que son emplacement n'est pas identique à son emplacement d'origine, j'ai programmé sa marge à une valeur négative qui le remet visuellement à l'endroit où il était à l'origine. Donc, ma question est, est-ce que quelqu'un sait comment je peux réaliser cette fonctionnalité de sorte que la grille NavigationGrid peut être retirée de son parent et plus tard placé retour dans son parent, avec son emplacement/emplacement d'origine étant dans le tact?

Merci.

Chris

Voici une capture d'écran de l'interface utilisateur. Pour des raisons évidentes, j'ai noirci certaines parties de l'interface utilisateur. La grille à gauche, avec l'étiquette "Processus", est la grille que l'utilisateur doit pouvoir "dégrafer" et déplacer, ce qui fonctionne, c'est la fonctionnalité qui le remet en place qui crée le problème.

alt text http://i45.tinypic.com/4rcpp5.jpg

Se référer au code derrière méthode ci-dessous qui gère la broche/fonctionnalité Détacher:

public void PinMenu(object parameter) 
    { 
     if (_navigationGridPinned) 
     { 
      PushPinImagePath = new Uri("../Images/pushpin_pinned.png", UriKind.Relative); 

      _navigationGridPinned = false; 

      var e = parameter as MouseButtonEventArgs; 

      if (!e.IsNull()) 
      { 
       var grid = ValidationHelper.GetPanelFromVisualTree(Application.Current.RootVisual, "NavigationGrid") as Grid; 

       if (!grid.IsNull()) 
       { 
        grid.MeasureAndArrange(); 

        double gridHeight = grid.ActualHeight; 

        double gridWidth = grid.ActualWidth; 

        grid.HorizontalAlignment = HorizontalAlignment.Left; 

        grid.VerticalAlignment = VerticalAlignment.Top; 

        grid.Margin = new Thickness(0, 0, 0, 0); 

        var parent = grid.Parent as Grid; 

        parent.Children.Remove(grid); 

        var layoutRootGrid = parent.Parent as Grid; 

        if (!layoutRootGrid.IsNull()) 
        { 
         _originalOffset = parent.TransformToVisual(layoutRootGrid).Transform(new Point(0, 0)); 

         grid.Height = gridHeight; 

         grid.Width = gridWidth; 

         var border = grid.Children[0] as Border; 

         if (!border.IsNull()) 
         { 
          border.BorderThickness = new Thickness(1, 1, 1, 1); 

          var backgroundBrush = App.Current.Resources["GradientBlueBrush"] as LinearGradientBrush; 

          if (!backgroundBrush.IsNull()) 
          { 
           border.Background = backgroundBrush; 
          } 
         } 

         layoutRootGrid.Children.Add(grid); 

         Grid.SetRow(grid, 1); 

         _adorner = new Adorner(); 

         _adorner.HorizontalAlignment = HorizontalAlignment.Left; 

         _adorner.VerticalAlignment = VerticalAlignment.Top; 

         _adorner.AdornedElement = grid as FrameworkElement; 

         _adorner.adorned_MouseLeftButtonDown((FrameworkElement)grid, e); 
        } 
       } 
      } 
     } 
     else 
     { 
      _navigationGridPinned = true; 

      PushPinImagePath = new Uri("../Images/pushpin.png", UriKind.Relative); 

      var grid = ValidationHelper.GetPanelFromVisualTree(Application.Current.RootVisual, "NavigationGrid") as Grid; 

      if (!grid.IsNull()) 
      { 
       var parent = grid.Parent as Grid; 

       if (parent != null) 
       { 
        var mainViewGrid = ValidationHelper.GetPanelFromVisualTree(Application.Current.RootVisual, "MainViewGrid") as Grid; 

        var parentGrid = mainViewGrid.Parent as Grid; 

        var layoutRootGrid = parentGrid.Parent as Grid; 

        var currentOffset = grid.TransformToVisual(layoutRootGrid).Transform(new Point(0, 0)); 

        Point p = new Point(-(currentOffset.X - _originalOffset.X), -(currentOffset.Y - _originalOffset.Y)); 

        parent.Children.Remove(grid); 

        parent.UpdateLayout(); 

        grid.MeasureAndArrange(); 

        var navBorder = ValidationHelper.GetPanelFromVisualTree(Application.Current.RootVisual, "NavBorder") as Border; 

        var tabMenuBorder = ValidationHelper.GetPanelFromVisualTree(Application.Current.RootVisual, "TabMenuBorder") as Border; 

        var processMapBorder = ValidationHelper.GetPanelFromVisualTree(Application.Current.RootVisual, "ProcessMapBorder") as Border; 

        mainViewGrid.Children.Clear(); 

        var border = grid.Children[0] as Border; 

        if (!border.IsNull()) 
        { 
         border.Background = new SolidColorBrush(Colors.Transparent); 

         border.BorderThickness = new Thickness(1, 0, 1, 1); 
        } 

        _adorner.HorizontalAlignment = HorizontalAlignment.Left; 

        _adorner.VerticalAlignment = VerticalAlignment.Top; 

        _adorner.Margin = new Thickness(0, 0, 0, 0); 

        _adorner.AdornedElement = null; 

        mainViewGrid.Children.Add(tabMenuBorder); 

        Grid.SetColumn(tabMenuBorder, 2); 

        Grid.SetRowSpan(tabMenuBorder, 2); 

        Grid.SetRow(tabMenuBorder, 1); 

        mainViewGrid.Children.Add(processMapBorder); 

        Grid.SetColumn(processMapBorder, 1); 

        Grid.SetRow(processMapBorder, 1); 

        mainViewGrid.Children.Add(navBorder); 

        Grid.SetColumnSpan(navBorder, 2); 

        Grid.SetRow(navBorder, 0); 

        Grid.SetColumn(navBorder, 1); 

        grid.Margin = new Thickness(p.X, p.Y, 0, 0); 

        mainViewGrid.Children.Add(grid); 

        Grid.SetColumn(grid, 0); 

        Grid.SetRow(grid, 0); 

        Grid.SetRowSpan(grid, 2); 
       } 
      } 
     } 
    } 
+0

captures d'écran et codebehind s'il vous plaît. –

+0

Par votre demande, j'ai modifié le post original pour inclure une capture d'écran et du code-behind. Faites-moi savoir si vous avez besoin d'informations supplémentaires. – Chris

Répondre

0

Une stratégie pourrait consister à envelopper votre « NavigationGrid » à l'intérieur d'une grille contenant « ContainerGrid » qui est " Visible "lorsque épinglé, et" Réduit "lorsqu'il n'est pas épinglé. De cette façon, lorsque vous re-parenting pendant l'opération de broche, vous pouvez placer le "NavigationGrid" dans le "ContainerGrid" nommé.

+0

J'ai essayé votre suggestion, et le problème a persisté; Cependant, cela m'a conduit à regarder le RenderTransform pour le NavigationGrid, qui, a été mis à un nouveau MatrixTransform par l'adorner. Donc, quand je voudrais épingler le menu, je ne définissais pas RenderTransform de NavigationGrid à null.Cela a réglé ce problème, mais votre suggestion m'a amené à regarder cela, donc, je vais vous donner le crédit. – Chris

+0

Je suis content que ça a marché Chris. –

Questions connexes