[英]How to move a Grid Panel in WPF Window
HI,
如何在WPF窗口內移動(拖動)網格面板? 網格面板沒有位置或位置或X和Y坐標屬性。 我所看到的就是使用鼠標將Grid Panel從當前位置移動到新位置,以便顯示在其下方“埋葬”的控件。
有什么指針嗎?
非常感謝。
這里有一些代碼示例可以幫助您入門:
在XAML中:
創建一個網格並在其上定義渲染變換:
<Grid x:Name="grid" Background="Blue"
Width="100" Height="100"
MouseDown="Grid_MouseDown" MouseMove="Grid_MouseMove" MouseUp="Grid_MouseUp">
<Grid.RenderTransform>
<TranslateTransform x:Name="tt"/>
</Grid.RenderTransform>
</Grid>
命名您希望網格在其中移動的控件:
<Window x:Name="window" ...>
<Grid x:Name="grid"...
</Window>
代碼背后:
Point m_start;
Vector m_startOffset;
private void Grid_MouseDown(object sender, MouseButtonEventArgs e)
{
m_start = e.GetPosition(window);
m_startOffset = new Vector(tt.X, tt.Y);
grid.CaptureMouse();
}
private void Grid_MouseMove(object sender, MouseEventArgs e)
{
if (grid.IsMouseCaptured)
{
Vector offset = Point.Subtract(e.GetPosition(window), m_start);
tt.X = m_startOffset.X + offset.X;
tt.Y = m_startOffset.Y + offset.Y;
}
}
private void Grid_MouseUp(object sender, MouseButtonEventArgs e)
{
grid.ReleaseMouseCapture();
}
根據Josh G的回答
如果你想移動一個網格,但是缺少幾個元素移動的能力,Josh的答案非常好。
這是如何分別移動幾個元素
XAML
<Grid x:Name="gridHost">
<Grid x:Name="gridBlue" Background="Blue" Width="100" Height="100" MouseDown="Grid_MouseDown" MouseMove="Grid_MouseMove" MouseUp="Grid_MouseUp" Margin="-100,0,0,0">
<Grid.RenderTransform>
<TranslateTransform/>
</Grid.RenderTransform>
</Grid>
<Grid x:Name="gridRed" Background="Red" Width="100" Height="100" MouseDown="Grid_MouseDown" MouseMove="Grid_MouseMove" MouseUp="Grid_MouseUp" Margin="100,0,0,0">
<Grid.RenderTransform>
<TranslateTransform/>
</Grid.RenderTransform>
</Grid>
</Grid>
代碼背后
Point m_start;
Vector m_startOffset;
private void Grid_MouseDown(object sender, MouseButtonEventArgs e)
{
FrameworkElement element = sender as Grid;
TranslateTransform translate = element.RenderTransform as TranslateTransform;
m_start = e.GetPosition(gridHost);
m_startOffset = new Vector(translate.X, translate.Y);
element.CaptureMouse();
}
private void Grid_MouseMove(object sender, MouseEventArgs e)
{
FrameworkElement element = sender as Grid;
TranslateTransform translate = element.RenderTransform as TranslateTransform;
if (element.IsMouseCaptured)
{
Vector offset = Point.Subtract(e.GetPosition(gridHost), m_start);
translate.X = m_startOffset.X + offset.X;
translate.Y = m_startOffset.Y + offset.Y;
}
}
private void Grid_MouseUp(object sender, MouseButtonEventArgs e)
{
FrameworkElement element = sender as Grid;
element.ReleaseMouseCapture();
}
public void dragme(object sender, MouseButtonEventArgs e)
{
if (_Move.IsChecked == true)
db.Attach((DependencyObject)sender);
}
//// MouseDragElementBehavior db;
private void canvass_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
if (_Move.IsChecked == true && filmgrid.Visibility == Visibility.Visible)// == true)
{
filmgrid.PreviewMouseDown += new MouseButtonEventHandler(dragme);
}
}
只需將網格面板放在畫布內而不是直接放入窗口中 - 這樣就可以得到X / Y坐標。
然后,您可以使用自定義附加屬性實現拖放行為,如此處詳述( http://www.deepcode.co.uk/archive/2008/11/16/using-attached-properties-to-compose-new -behaviour.aspx )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.