gpt4 book ai didi

c# - WPF 拖放、拖放

转载 作者:太空狗 更新时间:2023-10-29 23:50:52 25 4
gpt4 key购买 nike

我想将一个 Button 从一个 Stackpanel 拖放到另一个 Stackpanel。该实现仍然有效,但我希望在拖动事件期间将按钮附加到鼠标光标作为视觉反馈。

我整天都在寻找解决方案,但我只找到了 Canvas 而不是 Stackpanels 的解决方案。

这是我的代码:

Button.xaml

 <UserControl x:Class="LisaBeispiel2.Controls.ImageButton"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Name="IB"
AllowDrop="True">


<Grid>
<Button Margin="3 0 3 3"
VerticalAlignment="Top"
HorizontalAlignment="Left"
IsEnabled="{Binding IsButtonEnabled, ElementName=IB}">
<StackPanel Orientation="Vertical">
<Image Source="{Binding ElementName=IB, Path=Image}"
Width="35"
Height="35"
Margin="8" />
<TextBlock Text="{Binding ElementName=IB, Path=Text}"
Foreground="White"
FontSize="10"
FontFamily="Arial"
TextWrapping="Wrap"
TextAlignment="Center" />
</StackPanel>
</Button>

</Grid>

Button.xaml.cs

protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
if (e.LeftButton == MouseButtonState.Pressed)
{
// Package the data into a Dataobject
DataObject data = new DataObject();

data.SetData("Object", this);

// Inititate the drag-and-drop operation with 3 Parameter: dragSource, data, allowedEffects
DragDrop.DoDragDrop(this, data, DragDropEffects.All);
}
}

Window.xaml

  <StackPanel Orientation="Horizontal"
Drop="panel_Drop">
<controls:ImageButton
Image="/LisaBeispiel2;component/Images/Icons/Rotate.png"
Text="Rotate"/>
<controls:ImageButton
Image="/LisaBeispiel2;component/Images/Icons/Zoom_Pan.png"
Text="Zoom/Pan"/>
</StackPanel>
<StackPanel Orientation="Horizontal"
Drop="panel_Drop">
<controls:ImageButton
Image="/LisaBeispiel2;component/Images/Icons/ButtonPlatzhalter.png"
Text="Add"/>
<controls:ImageButton
Image="/LisaBeispiel2;component/Images/Icons/ButtonPlatzhalter.png"
Text="Add"/>
</StackPanel>
</StackPanel>
</StackPanel>

Window.xaml.cs

    private void panel_Drop(object sender, DragEventArgs e)
{
// If an element in the panel has already handled the drop,
// the panel should not also handle it.
if (e.Handled == false)
{
Panel _panel = (Panel)sender;
UIElement _element = (UIElement)e.Data.GetData("Object");

if (_panel != null && _element != null)
{
// Get the panel that the element currently belongs to,
// then remove it from that panel and add it the Children of
// the panel that its been dropped on.
Panel _parent = (Panel)VisualTreeHelper.GetParent(_element);

if (_parent != null)
{
_parent.Children.Remove(_element);
_panel.Children.Add(_element);

}

}
}
}

最佳答案

void StackPanel_DragEnter(object sender, System.Windows.DragEventArgs e)
{
e.Effects = System.Windows.DragDropEffects.Copy;
}

您可以使用此事件并对其进行修改,使其适用于您的拖放事件..

关于c# - WPF 拖放、拖放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28212969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com