Изменение размера элемента управления Thumb на холсте в WPF - PullRequest
0 голосов
/ 21 июля 2009

Я динамически поместил пользовательский элемент управления в Canvas как корень VisualTree в элементе управления 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);

В методе DragDelta этот подход работает для изменения размера пользовательского элемента управления с восточного прямоугольника изменения размера:

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

Но где бы я ни пытался это сделать, плюс установил Canvas.Top элемента управления Thumb (т. Е. Из прямоугольника изменения размера на север), я не получал ожидаемых результатов:

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

В таком случае происходит то, что элемент управления перемещается вверх и вниз в элементе управления холстом, но его размеры изменяются только на один пиксель, независимо от изменения по вертикали или горизонтали. Любые идеи относительно того, почему это происходит, и предложения по решению проблемы? Спасибо!

Ответы [ 2 ]

1 голос
/ 11 ноября 2009

попробуйте использовать этот класс (ResizeThumb), который объясняется в этом примере WPF Diagram Designer: Часть 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 голосов
/ 22 июля 2009

Этот пример, взятый из 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();
    }
}
...