WPF网格拖动自动布局效果

这篇具有很好参考价值的文章主要介绍了WPF网格拖动自动布局效果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

WPF网格拖动自动布局效果

使用Canvas和鼠标相关事件实现如下的效果:
WPF网格拖动自动布局效果,WPF开发心得,自定义控件,WPF技术,wpf
XAML代码:

<Window x:Class="CanvasTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:CanvasTest"
        mc:Ignorable="d"
        Name="root"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <Style TargetType="Rectangle">
            <Setter Property="Fill" Value="#0785D4"/>
            <Setter Property="Stroke" Value="White"/>
            <Setter Property="StrokeThickness" Value="2"/>
            <Setter Property="Width" Value="45"/>
            <Setter Property="Height" Value="45"/>
            <Setter Property="RadiusX" Value="4"/>
            <Setter Property="RadiusY" Value="4"/>
            <Setter Property="RenderTransformOrigin" Value="0.5,0.5"/>
            <Setter Property="RenderTransform">
                <Setter.Value>
                    <TransformGroup>
                        <ScaleTransform/>
                    </TransformGroup>
                </Setter.Value>
            </Setter>
            <Setter Property="Effect">
                <Setter.Value>
                    <DropShadowEffect Opacity="0.8" BlurRadius="4" Color="#8A8A8A" ShadowDepth="0"/>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=root,Path=IsDraging}" Value="True">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="RenderTransform.Children[0].ScaleX" To="0.9" Duration="0:0:0.15"/>
                                <DoubleAnimation Storyboard.TargetProperty="RenderTransform.Children[0].ScaleY" To="0.9" Duration="0:0:0.15"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>

                    <DataTrigger.ExitActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="RenderTransform.Children[0].ScaleX" To="1" Duration="0:0:0.25"/>
                                <DoubleAnimation Storyboard.TargetProperty="RenderTransform.Children[0].ScaleY" To="1" Duration="0:0:0.25"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.ExitActions>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.Background>
            <VisualBrush Viewport="0,0,50,50" Stretch="None" ViewportUnits="Absolute" TileMode="Tile">
                <VisualBrush.Visual>
                    <Rectangle Stroke="#C6C6C6" RadiusX="0" RadiusY="0" StrokeDashArray="4,2" Width="50" Height="50" Fill="Transparent" StrokeThickness="0.5"/>
                </VisualBrush.Visual>
            </VisualBrush>
        </Grid.Background>
        <Canvas Name="canvas" Margin="2.5">
            <Rectangle MouseLeftButtonDown="Rectangle_MouseLeftButtonDown" MouseMove="Rectangle_MouseMove" MouseLeftButtonUp="Rectangle_MouseLeftButtonUp" Canvas.Left="0" Canvas.Top="0"/>
            <Rectangle MouseLeftButtonDown="Rectangle_MouseLeftButtonDown" MouseMove="Rectangle_MouseMove" MouseLeftButtonUp="Rectangle_MouseLeftButtonUp" Canvas.Left="50" Canvas.Top="0"/>
            <Rectangle MouseLeftButtonDown="Rectangle_MouseLeftButtonDown" MouseMove="Rectangle_MouseMove" MouseLeftButtonUp="Rectangle_MouseLeftButtonUp" Canvas.Left="100" Canvas.Top="0"/>

            <Rectangle MouseLeftButtonDown="Rectangle_MouseLeftButtonDown" MouseMove="Rectangle_MouseMove" MouseLeftButtonUp="Rectangle_MouseLeftButtonUp" Canvas.Left="0" Canvas.Top="50" />
            <Rectangle MouseLeftButtonDown="Rectangle_MouseLeftButtonDown" MouseMove="Rectangle_MouseMove" MouseLeftButtonUp="Rectangle_MouseLeftButtonUp" Canvas.Left="50" Canvas.Top="50"/>
            <Rectangle MouseLeftButtonDown="Rectangle_MouseLeftButtonDown" MouseMove="Rectangle_MouseMove" MouseLeftButtonUp="Rectangle_MouseLeftButtonUp" Canvas.Left="100" Canvas.Top="50"/>

            <Rectangle MouseLeftButtonDown="Rectangle_MouseLeftButtonDown" MouseMove="Rectangle_MouseMove" MouseLeftButtonUp="Rectangle_MouseLeftButtonUp" Canvas.Left="0" Canvas.Top="100" />
            <Rectangle MouseLeftButtonDown="Rectangle_MouseLeftButtonDown" MouseMove="Rectangle_MouseMove" MouseLeftButtonUp="Rectangle_MouseLeftButtonUp" Canvas.Left="50" Canvas.Top="100"/>
            <Rectangle MouseLeftButtonDown="Rectangle_MouseLeftButtonDown" MouseMove="Rectangle_MouseMove" MouseLeftButtonUp="Rectangle_MouseLeftButtonUp" Canvas.Left="100" Canvas.Top="100"/>

            <Rectangle MouseLeftButtonDown="Rectangle_MouseLeftButtonDown" Width="95" Height="95" MouseMove="Rectangle_MouseMove" MouseLeftButtonUp="Rectangle_MouseLeftButtonUp" Canvas.Left="200" Canvas.Top="150">
                <Rectangle.Fill>
                    <ImageBrush ImageSource=".\Koala.jpg" Stretch="UniformToFill" RenderOptions.BitmapScalingMode="Fant">
                    </ImageBrush>
                </Rectangle.Fill>
            </Rectangle>
            <Rectangle MouseLeftButtonDown="Rectangle_MouseLeftButtonDown" Width="95" Height="45" MouseMove="Rectangle_MouseMove" MouseLeftButtonUp="Rectangle_MouseLeftButtonUp" Canvas.Left="350" Canvas.Top="150"/>

        </Canvas>
    </Grid>
</Window>

C#代码

 public partial class MainWindow : Window
 {
     public MainWindow()
     {
         InitializeComponent();
     }

     public bool IsDraging
     {
         get { return (bool)GetValue(IsDragingProperty); }
         set { SetValue(IsDragingProperty, value); }
     }
     public static readonly DependencyProperty IsDragingProperty =
         DependencyProperty.Register("IsDraging", typeof(bool), typeof(MainWindow), new PropertyMetadata(false));

     Point lastPoint = default;
     private void Rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
     {
         IsDraging = true;
         (sender as Rectangle)?.CaptureMouse();
         lastPoint = e.GetPosition(canvas);
     }

     private void Rectangle_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
     {
         IsDraging = false;
         (sender as Rectangle)?.ReleaseMouseCapture();
         Point nowPoint = e.GetPosition(canvas);
         int index_X = (int)nowPoint.X / 50;
         int index_Y = (int)nowPoint.Y / 50;

         Point target = new Point(index_X * 50, index_Y * 50);

         Canvas.SetLeft(sender as Rectangle, target.X);
         Canvas.SetTop(sender as Rectangle, target.Y);
         for (int i = 0; i < canvas.Children.Count; i++)
         {
             Panel.SetZIndex(canvas.Children[i], i);
         }

         Panel.SetZIndex(sender as Rectangle, canvas.Children.Count);
     }

     private void Rectangle_MouseMove(object sender, MouseEventArgs e)
     {
         if (e.LeftButton == MouseButtonState.Released || !IsDraging)
         {
             return;
         }

         var nowPoint = e.GetPosition(canvas);
         var rect = (sender as Rectangle);
         Panel.SetZIndex(rect, 999);
         Point offset = new Point(nowPoint.X - lastPoint.X, nowPoint.Y - lastPoint.Y);

         Canvas.SetLeft(rect, Canvas.GetLeft(rect) + offset.X);
         Canvas.SetTop(rect, Canvas.GetTop(rect) + offset.Y);
         lastPoint = nowPoint;
     }
 }

项目地址github文章来源地址https://www.toymoban.com/news/detail-670413.html

到了这里,关于WPF网格拖动自动布局效果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于GSYVideoPlayer自定义布局结合RecyclerView高仿抖音实现上下滑动双击屏幕点赞/单击暂停,拖动进度条实时改变时间以及进度条放大

    注意代码量有点多,但是你不要就此放弃,看效果图决定你需不需该需求😀并且代码好理解基本上都是基于GSYVideoPlayer的方法进行重写改造出来的,请放心食用 GSYVideoPlayer是一款开源并且强大的Android视频播放器方便你们阅读了GSYVideoPlayer更快速的上手GSYVideoPlayer框架地址 效果

    2024年02月03日
    浏览(162)
  • 【CSS】网格布局(简单布局、网格合并、网格嵌套)

    CSS网格布局(Grid Layout)是一种强大且灵活的CSS布局系统,允许开发者以网格形式组织和定位HTML元素。网格布局可以帮助我们在一个容器中定义行(rows)和列(columns),然后将元素放置在这些网格中。这种布局方式比传统的基于浮动和定位的布局更直观和易于管理,特别适

    2024年02月13日
    浏览(42)
  • 【Axure高保真原型】中继器网格图片拖动摆放

    今天和大家分享中继器网格图片拖动摆放的原型模板,我们可以通过鼠标拖动来移动图片,拖动过程其他图标会根据图片拖动自动排列,松开鼠标是图片停放在指定位置,其他图标自动排列。那这个模板是用中继器制作的,所以使用也很方便,我们只需维护中继器表格的信息

    2024年02月10日
    浏览(53)
  • WPF自定义漂亮顶部工具栏 WPF自定义精致最大化关闭工具栏 wpf导航栏自定义 WPF快速开发工具栏

    在WPF应用程序开发中,自定义一个漂亮的顶部工具栏具有多重关键作用,它不仅增强了用户体验,还提升了整体应用的专业性和易用性。以下是对这一功能的详细介绍: 首先,自定义顶部工具栏是用户界面设计的重要组成部分,它集成了应用程序的核心操作入口,如关闭、最

    2024年01月15日
    浏览(52)
  • 【Qt】盒子布局、网格布局、表单布局和堆栈布局

    QBoxLayout可以在水平方向或垂直方向上排列控件,分别派生了QHBoxLayout、QVBoxLayout子类。 QHBoxLayout:水平布局,在水平方向上排列控件,即:左右排列。 QVBoxLayout:垂直布局,在垂直方向上排列控件,即:上下排列。 水平布局、垂直布局除了构造时的方向(LeftToRight、TopToBotto

    2024年02月06日
    浏览(43)
  • js 实现拖动按钮添加布局

    效果: h布局生成左右布局, v布局生成上下布局 代码: css 文件:

    2024年02月02日
    浏览(36)
  • Android基本布局-GridLayout_网格布局

    概述 :网格布局相对于表格布局来说自由度更高,是以行数和列数来确定位置进行排列。就像一间教室,确定好行数与列数就能让同学有序入座。 1. 可以设置布局中组件的排列方式 2. 可以自定行列数 GridLayout 常用布局标签: android:columnCount=\\\"4\\\" :设置最大列数,这里设置为4。

    2023年04月08日
    浏览(48)
  • 使用WPF开发自定义用户控件,以及实现相关自定义事件的处理

    在前面随笔《使用Winform开发自定义用户控件,以及实现相关自定义事件的处理》中介绍了Winform用户自定义控件的处理,对于Winform自定义的用户控件来说,它的呈现方式主要就是基于GDI+进行渲染的,对于数量不多的控件呈现,一般不会觉察性能有太多的问题,随着控件的数量

    2024年02月02日
    浏览(52)
  • Qt鼠标拖动控件交换布局位置

    方法很简单,交换鼠标起点控件指针和鼠标落点控件指针的值,然后重新布局 Qt鼠标拖动控件交换布局位置 源文件 头文件 下面是只交换控件显示的内容: 添加鼠标贴图,跟随鼠标移动: 一种实现:重写void paintEvent(QPaintEvent *event);方法 另一种实现:

    2024年02月11日
    浏览(39)
  • WPF-利用装饰器实现空间的自由拖动

    在项目中经常会遇到类似如下要求的需求,创建允许自由拖动的控件,这样的需求可以使用WPF的装饰器Adorner来实现。   装饰器是一种特殊类型的FrameworkElement,装饰器始终呈现在被装饰元素的顶部,用于向用户提供可视化提示。装饰器可以在不改变原有控件结构的基础上,将

    2024年02月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包