2009-07-21 10 views
0

J'ai dynamiquement placé un contrôle utilisateur sur un Canvas comme racine VisualTree dans un contrôle Thumb. Je peux déplacer le contrôle du pouce correctement, mais je peux seulement redimensionner correctement le contrôle lors du redimensionnement des rectangles est, sud-est et sud définis dans le contrôle utilisateur.Redimensionner Thumb Template Control sur le canevas dans WPF

//Instantiate a new Thumb control to be placed on the canvas. 
var myThumb = new Thumb(); 
myThumb.Name = "myThumb"; 

//Instantiate a new ThumbTemplate and ElementFactory with my user control. 
var myThumbTemplate = new ControlTemplate(typeof(Thumb)); 
myThumbTemplate.VisualTree = new FrameworkElementFactory(typeof(MyUserControl), "myUserControl"); 

//Set the thumb template to the newly instantiated template. 
myThumb.Template = myThumbTemplate; 

//Point the DragDelta and DragCompleted events to local methods. 
myThumb.DragDelta += new DragDeltaEventHandler(myThumb_DragDelta); 
myThumb.DragCompleted += new DragCompletedEventHandler(myThumb_DragCompleted); 

//Add the thumb to the canvas control. 
this.myCanvas.Children.Add(myThumb); 
Canvas.SetZIndex(myThumb, 1); 
Canvas.SetTop(myThumb, 75); 
Canvas.SetLeft(myThumb, 50); 

Dans la méthode DragDelta, cette approche fonctionne pour redimensionner le contrôle de l'utilisateur du rectangle de redimensionnement de l'est:

var myThumb = sender as Thumb; 
if (myThumb != null) 
{ 
    var myUserControl = myThumb.Template.FindName("myUserControl", myThumb) as MyUserControl; 
    if (myUserControl != null) 
    { 
     myUserControl.Width = myUserControl.OldWidth + e.HorizontalChange; 
    } 
} 

Mais chaque fois que je tente de faire, plus régler la Canvas.Top du contrôle Thumb (Ie . du rectangle re grandeur du Nord), je ne reçois pas les résultats que j'attendais:

double top = Canvas.GetTop(finderThumb) + e.VerticalChange; 
myUserControl.Height = myUserControl.OldHeight - e.VerticalChange; 
Canvas.SetTop(myThumb, top); 

Qu'est-ce qui se passe alors que le contr ol se déplace de haut en bas dans le contrôle de la toile, mais ne redimensionne que d'un pixel, quel que soit le changement vertical ou horizontal. Des idées sur les raisons de cette situation et des suggestions pour résoudre le problème? Merci!

Répondre

0

Cet exemple saisi à partir de MSDN montre qu'il ajoute e.VerticalChange au lieu de soustraire. Peut-être que c'est le problème?

void onDragDelta(object sender, DragDeltaEventArgs e) 
{ 
    //Move the Thumb to the mouse position during the drag operation 
    double yadjust = myCanvasStretch.Height + e.VerticalChange; 
    double xadjust = myCanvasStretch.Width + e.HorizontalChange; 
    if ((xadjust >= 0) && (yadjust >= 0)) 
    { 
     myCanvasStretch.Width = xadjust; 
     myCanvasStretch.Height = yadjust; 
     Canvas.SetLeft(myThumb, Canvas.GetLeft(myThumb) + 
           e.HorizontalChange); 
     Canvas.SetTop(myThumb, Canvas.GetTop(myThumb) + 
           e.VerticalChange); 
     changes.Text = "Size: " + 
         myCanvasStretch.Width.ToString() + 
         ", " + 
         myCanvasStretch.Height.ToString(); 
    } 
} 
+0

Eh bien, quand je ne cherche pas à définir le haut du contrôle, il me semble être obtenir le comportement correct en soustrayant le VerticalChange dans ce cas. En d'autres termes, la sélection de la bordure supérieure (nord) du contrôle et le déplacement vers le haut entraînent une augmentation de la hauteur du contrôle, tandis que le fait de faire glisser vers le bas entraîne une diminution de la hauteur du contrôle. Le problème est alors que la bordure N du contrôle ne reste pas avec la souris. Cependant, même la simple commutation du signe ne résout pas le problème, c'est-à-dire que le contrôle ne redimensionne que d'un pixel malgré la valeur de VerticalChange. –

1

essayer d'utiliser cette classe (ResizeThumb) qui est expliqué dans cet exemple WPF Diagram Designer: Part 1

public class ResizeThumb : Thumb 
{ 
    public ResizeThumb() 
    { 
     DragDelta += new DragDeltaEventHandler(this.ResizeThumb_DragDelta); 
    }  

    private void ResizeThumb_DragDelta(object sender, DragDeltaEventArgs e) 
    { 
     Control item = this.DataContext as Control; 
     if (item != null) 
     { 
      double deltaVertical, deltaHorizontal; 

      switch (VerticalAlignment) 
      { 
       case VerticalAlignment.Bottom: 
        deltaVertical = Math.Min(-e.VerticalChange, 
         item.ActualHeight - item.MinHeight); 
        item.Height -= deltaVertical; 
        break; 
       case VerticalAlignment.Top: 
        deltaVertical = Math.Min(e.VerticalChange, 
         item.ActualHeight - item.MinHeight); 
        Canvas.SetTop(item, Canvas.GetTop(item) + deltaVertical); 
        item.Height -= deltaVertical; 
        break; 
       default: 
        break; 
      } 

      switch (HorizontalAlignment) 
      { 
       case HorizontalAlignment.Left: 
        deltaHorizontal = Math.Min(e.HorizontalChange, 
         item.ActualWidth - item.MinWidth); 
        Canvas.SetLeft(item, Canvas.GetLeft(item) + deltaHorizontal); 
        item.Width -= deltaHorizontal; 
        break; 
       case HorizontalAlignment.Right: 
        deltaHorizontal = Math.Min(-e.HorizontalChange, 
         item.ActualWidth - item.MinWidth); 
        item.Width -= deltaHorizontal; 
        break; 
       default: 
        break; 
      } 
     } 
     e.Handled = true; 
    } 
} 
+0

J'ai sauvé ma journée. Merci. – dotNET

Questions connexes