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