Home > front end >  How to define a limit to the movement of an object in a canvas?
How to define a limit to the movement of an object in a canvas?

Time:01-19

I have a canvas in which I create labels that I can move around. I would like to be able to "block" the movement at the border, or even at a given value: For example, I would like to be able to go no further than X = 1028 on the right.Or better yet, if I drop the label above this max value, it should return to its initial position.

Is this possible and how?

my code :

public partial class WPFPlanningJournalier : Window
{
    protected bool isDragging;
    private Point clickPosition;
    private TranslateTransform originTT;
    private bool OuvrirLignePrise;
    private bool positionDepartAgentPresent;
    private bool positionTropADroite;
    private bool startPosition;

    public WPFPlanningJournalier()
    {
        InitializeComponent();
    }

    private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {          
        ((PlanningJournalierViewModel)(this.DataContext)).AgentSelected(sender.ToString());
        var draggableControl = sender as Label;
        originTT = draggableControl.RenderTransform as TranslateTransform ?? new TranslateTransform();
        isDragging = true;
        clickPosition = e.GetPosition(this);
        draggableControl.CaptureMouse();
    }

    private void Canvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        isDragging = false;
        var draggable = sender as Label;

        draggable.ReleaseMouseCapture();
        Cursor = Cursors.Arrow;
    }

    private void Canvas_MouseMove(object sender, MouseEventArgs e)
    {
        var draggableControl = sender as Label;
        if (isDragging && draggableControl != null)
        {
            Cursor = Cursors.ScrollAll;

            Point currentPosition = e.GetPosition(this);
            var transform = draggableControl.RenderTransform as TranslateTransform ?? new TranslateTransform();
            transform.X = originTT.X   (currentPosition.X - clickPosition.X);
            //transform.Y = originTT.Y   (currentPosition.Y - clickPosition.Y);
            X.Text = $"X = { currentPosition.X}";
            Y.Text = $"Y = { currentPosition.Y}";
            draggableControl.RenderTransform = new TranslateTransform(transform.X, transform.Y);

            if (currentPosition.X > 1028) //this doesnt work
            {
                transform.X = clickPosition.X;
            }
        }
    }
}

WPF part :

        <ScrollViewer
        Grid.Row="1"
        Grid.Column="1"
        Margin="0,25,0,0"
        Panel.ZIndex="12"
        TabIndex="100">
        <ItemsControl
            x:Name="ICAgentAffiché"
            MinHeight="{Binding HauteurPlanning}"
            HorizontalAlignment="Stretch"
            ItemsSource="{Binding Path=AffichageAgent}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Canvas Background="Transparent" />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemContainerStyle>
                <Style TargetType="ContentPresenter">
                    <Setter Property="Canvas.Left" Value="{Binding Left}" />
                    <Setter Property="Canvas.Top" Value="{Binding Top}" />
                </Style>
            </ItemsControl.ItemContainerStyle>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Label
                        x:Name="LbAgentAffiche"
                        Width="{Binding Width}"
                        Height="17"
                        Padding="1"
                        HorizontalContentAlignment="Center"
                        VerticalContentAlignment="Top"
                        Panel.ZIndex="22"
                        Background="{Binding Color, Converter={StaticResource ServiceSectionColorConverter}, Mode=OneWay}"
                        BorderBrush="Black"
                        BorderThickness="0.5"
                        Content="{Binding Path=NomPrenom}"
                        FontSize="10"
                        MouseLeftButtonDown="Canvas_MouseLeftButtonDown"
                        MouseLeftButtonUp="Canvas_MouseLeftButtonUp"
                        MouseMove="Canvas_MouseMove" />
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </ScrollViewer>

What happen actually when i'm moving label on border :

enter image description here

CodePudding user response:

It's because when you do this:

        if (currentPosition.X > 1028) //this doesnt work
        {
            transform.X = clickPosition.X;
        }

You use transform, that is a different instance than the transform you use. You instanciated a new RenderTransform just before:

draggableControl.RenderTransform = new TranslateTransform(transform.X, transform.Y);

This should works:

        if (currentPosition.X > 1028)
        {
             ((TranslateTransform)draggableControl.RenderTransform).X = clickPosition.X;
        }
  •  Tags:  
  • Related