【发布时间】:2019-08-20 08:39:03
【问题描述】:
我试图让用户设计自己的表单并将控件位置保存到数据库中。 现在,我能够允许用户生成新控件并在表单中移动它们。我不知道如何让控件的位置到我的 Datacontext。我只能绑定宽度等...
我希望我可以将 canvas.left 和 canvas.top 绑定到 datacontext,但它们没有在 renderTransform 上更新。
有什么想法吗?感谢您的帮助。
这是移动控件的表单返回代码:
private Control _currentlyDragged;
private Point _currentlyDraggedMouseOffset;
private void Window_PreviewMouseMove(object sender, MouseEventArgs e)
{
if (_currentlyDragged != null)
{
var mousePos = e.GetPosition(this);
var futurePos = e.GetPosition(BuildCanvas);
if (futurePos.X <= 0 || futurePos.Y <= 0 || futurePos.Y >= BuildCanvas.ActualHeight || futurePos.X >= BuildCanvas.ActualWidth)
return;
_currentlyDragged.RenderTransform = new TranslateTransform(mousePos.X - _currentlyDraggedMouseOffset.X, mousePos.Y - _currentlyDraggedMouseOffset.Y);
}
}
private void Window_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (_currentlyDragged != null)
_currentlyDragged = null;
ReleaseMouseCapture();
}
private void Window_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Point pt = e.GetPosition((UIElement)sender);
_hitResultsList.Clear();
VisualTreeHelper.HitTest(this, null, new HitTestResultCallback(MyHitTestResult), new PointHitTestParameters(pt));
if (!_hitResultsList.Where(h => h is Border && ((Border)h).Name == "BuildCanvas").Any())
return;
if (_hitResultsList.Count > 0)
{
foreach (DependencyObject d in _hitResultsList)
{
var parent = VisualTreeHelper.GetParent(d);
if (parent != null && (parent is Label || parent is TextBox))
{
CaptureMouse();
_currentlyDragged = parent as Control;
if (_currentlyDragged.RenderTransform is TranslateTransform)
{
_currentlyDraggedMouseOffset.X = e.GetPosition(this).X - ((TranslateTransform)_currentlyDragged.RenderTransform).X;
_currentlyDraggedMouseOffset.Y = e.GetPosition(this).Y - ((TranslateTransform)_currentlyDragged.RenderTransform).Y;
}
else
{
_currentlyDraggedMouseOffset.X = pt.X;
_currentlyDraggedMouseOffset.Y = pt.Y;
}
return;
}
}
}
_currentlyDragged = null;
}
private HitTestResultBehavior MyHitTestResult(HitTestResult result)
{
_hitResultsList.Add(result.VisualHit);
return HitTestResultBehavior.Continue;
}
这里是 ItemsControl:
<Border x:Name="BuildCanvas" Grid.Column="1" Grid.Row="0" Background="#fff4c9" CornerRadius="10">
<Grid>
<!-- Generated controls -->
<ItemsControl ItemsSource="{Binding TextBoxCollection}" Panel.ZIndex="1">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox HorizontalAlignment="Left" VerticalAlignment="Top" Padding="2" IsEnabled="False" Background="White"
Text="{Binding Name, Mode=OneWay}" Width="{Binding Width}">
</TextBox>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<!-- -->
</Grid>
</Border>
【问题讨论】:
-
我认为 rendertransform 仅用作在拖动效果发生时显示拖动效果的一种方式。拖动完成后,您可能应该以不同的方式更新结果位置(布局转换或重新定位)