如何定义canvas中对象移动的限制?
How to define a limit to the movement of an object in a canvas?
我有一个 canvas,我可以在其中创建可以移动的标签。
我希望能够“阻止”边界处的移动,甚至在给定值处:例如,我希望能够在 right.Or 上不超过 X = 1028 更好,如果我将标签放在这个最大值之上,它应该 return 到它的初始位置。
这可能吗?如何实现?
我的代码:
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 部分:
<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>
当我在边框上移动标签时实际发生了什么:
这是因为当你这样做的时候:
if (currentPosition.X > 1028) //this doesnt work
{
transform.X = clickPosition.X;
}
您使用 transform,这与您使用的转换不同。
您在之前实例化了一个新的 RenderTransform:
draggableControl.RenderTransform = new TranslateTransform(transform.X, transform.Y);
这应该有效:
if (currentPosition.X > 1028)
{
((TranslateTransform)draggableControl.RenderTransform).X = clickPosition.X;
}
我有一个 canvas,我可以在其中创建可以移动的标签。 我希望能够“阻止”边界处的移动,甚至在给定值处:例如,我希望能够在 right.Or 上不超过 X = 1028 更好,如果我将标签放在这个最大值之上,它应该 return 到它的初始位置。
这可能吗?如何实现?
我的代码:
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 部分:
<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>
当我在边框上移动标签时实际发生了什么:
这是因为当你这样做的时候:
if (currentPosition.X > 1028) //this doesnt work
{
transform.X = clickPosition.X;
}
您使用 transform,这与您使用的转换不同。 您在之前实例化了一个新的 RenderTransform:
draggableControl.RenderTransform = new TranslateTransform(transform.X, transform.Y);
这应该有效:
if (currentPosition.X > 1028)
{
((TranslateTransform)draggableControl.RenderTransform).X = clickPosition.X;
}