2009-07-21 54 views
0

ThumbコントロールのVisualTreeルートとしてCanvasにユーザーコントロールを動的に配置しました。サムコントロールを正しく移動することはできますが、ユーザーコントロールで定義されている東、南東、南の四角形からサイズを変更しながら、コントロールのサイズを正しく変更できるだけです。 DragDelta方法でWPFのキャンバスでのThumbテンプレートコントロールのサイズ変更

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

、このアプローチは、長方形のサイズを変更する東からユーザーコントロールのサイズを変更するために動作します:

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

しかし、私はそれを行うプラスThumbコントロール(IEのCanvas.Topを設定しようとするところはどこでも私は期待した結果を得ることができません:

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

何が起こるかはcontr olはキャンバスコントロールで上下に動きますが、縦または横の変化にかかわらず、1ピクセルだけサイズを変更します。なぜこのようなことが起こるのか、問題を解決するための提案はありますか?ありがとう!

答えて

0

MSDNから取得したこの例では、減算する代わりにe.VerticalChangeが追加されています。多分それは問題ですか?

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

この例で説明されている、このクラス(ResizeThumb)を使用してみてくださいこの場合、VerticalChangeを減算することによって正しい動作が得られます。つまり、コントロールの上部(北)の境界線を選択してドラッグすると、コントロールの高さが高くなりますが、ドラッグするとコントロールの高さが低くなります。問題は、コントロールのN境界線がマウスに残っていないことです。 でも、符号を切り替えるだけでは問題は解決されません。つまり、VerticalChangeの値にもかかわらず、コントロールが1ピクセルだけサイズを変更します。 –

1

私がコントロールの上を設定しようとしないとき、私はなっているようだ、まあ 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

保存日。ありがとう。 – dotNET

関連する問題