最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# wpf Grid中實(shí)現(xiàn)控件拖動(dòng)調(diào)整大小的示例代碼

 更新時(shí)間:2022年08月05日 09:29:19   作者:CodeOfCC  
本文主要介紹了C# wpf Grid中實(shí)現(xiàn)控件拖動(dòng)調(diào)整大小的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

在《C# wpf Canvas中實(shí)現(xiàn)控件動(dòng)態(tài)調(diào)整大小》中我們實(shí)現(xiàn)了Canvas中的控件動(dòng)態(tài)調(diào)整大小,由于Grid也是可層疊布局,在Grid中也是可以實(shí)現(xiàn)動(dòng)態(tài)調(diào)整大小的。

一、功能說(shuō)明

8個(gè)點(diǎn)方放置在控件的8個(gè)方位上,通過(guò)拖動(dòng)這些點(diǎn)對(duì)控件進(jìn)行拉伸或縮小,示意圖如下:

在這里插入圖片描述

二、如何實(shí)現(xiàn)?

1.繼承Adorner

通過(guò)裝飾器的方式添加8個(gè)點(diǎn)在控件上,這樣既可以不影響控件布局,又可以自由擺放8點(diǎn)控件。通過(guò)重寫(xiě)方法,給裝飾添加控件。必要的重寫(xiě)的方法如下面示例所示:

public class GridAdorner : Adorner
{
  //獲取裝飾器的元素個(gè)數(shù)
  protected override Visual GetVisualChild(int index);
  //指定裝飾器子元素個(gè)數(shù)
  protected override int VisualChildrenCount{get;}
  //布局,添加的子元素需要手動(dòng)布局。
  protected override Size ArrangeOverride(Size finalSize);      
}

2.使用Thumb

因?yàn)門(mén)humb實(shí)現(xiàn)拖動(dòng)比較容易,有相關(guān)事件獲取拖動(dòng)距離。在裝飾器中定義8個(gè)Thumb,對(duì)應(yīng)8個(gè)方位點(diǎn)。
示例代碼如下:

//4條邊
Thumb _leftThumb, _topThumb, _rightThumb, _bottomThumb;
//4個(gè)角
Thumb _lefTopThumb, _rightTopThumb, _rightBottomThumb, _leftbottomThumb;

初始化

 public GridAdorner(UIElement adornedElement) : base(adornedElement)
 {
     //初始化thumb
     _leftThumb = new Thumb();
     _leftThumb.HorizontalAlignment = HorizontalAlignment.Left;
     _leftThumb.VerticalAlignment = VerticalAlignment.Center;
     _leftThumb.Cursor = Cursors.SizeWE;
     //其他略...
}

3.實(shí)現(xiàn)拖動(dòng)邏輯

在Thumb的DragDelta事件可以獲取拖動(dòng)距離,根據(jù)八個(gè)方位的不同計(jì)算并修改控件的大小。

private void Thumb_DragDelta(object sender, DragDeltaEventArgs e)
{
//1.右側(cè)點(diǎn)HorizontalChange加寬,右邊距減HorizontalChange
//2.左側(cè)點(diǎn)HorizontalChange減寬,左邊距加HorizontalChange
//3.下側(cè)點(diǎn)VerticalChange加高,下邊距減VerticalChange
//4.上側(cè)點(diǎn)VerticalChange減高,上邊距加VerticalChange
}

三、完整代碼

代碼如下:

 public class GridAdorner : Adorner
    {
        //4條邊
        Thumb _leftThumb, _topThumb, _rightThumb, _bottomThumb;
        //4個(gè)角
        Thumb _lefTopThumb, _rightTopThumb, _rightBottomThumb, _leftbottomThumb;
        //布局容器,如果不使用布局容器,則需要給上述8個(gè)控件布局,實(shí)現(xiàn)和Grid布局定位是一樣的,會(huì)比較繁瑣且意義不大。
        Grid _grid;
        UIElement _adornedElement;
        public GridAdorner(UIElement adornedElement) : base(adornedElement)
        {
            _adornedElement = adornedElement;
            //初始化thumb
            _leftThumb = new Thumb();
            _leftThumb.HorizontalAlignment = HorizontalAlignment.Left;
            _leftThumb.VerticalAlignment = VerticalAlignment.Center;
            _leftThumb.Cursor = Cursors.SizeWE;
            _topThumb = new Thumb();
            _topThumb.HorizontalAlignment = HorizontalAlignment.Center;
            _topThumb.VerticalAlignment = VerticalAlignment.Top;
            _topThumb.Cursor = Cursors.SizeNS;
            _rightThumb = new Thumb();
            _rightThumb.HorizontalAlignment = HorizontalAlignment.Right;
            _rightThumb.VerticalAlignment = VerticalAlignment.Center;
            _rightThumb.Cursor = Cursors.SizeWE;
            _bottomThumb = new Thumb();
            _bottomThumb.HorizontalAlignment = HorizontalAlignment.Center;
            _bottomThumb.VerticalAlignment = VerticalAlignment.Bottom;
            _bottomThumb.Cursor = Cursors.SizeNS;
            _lefTopThumb = new Thumb();
            _lefTopThumb.HorizontalAlignment = HorizontalAlignment.Left;
            _lefTopThumb.VerticalAlignment = VerticalAlignment.Top;
            _lefTopThumb.Cursor = Cursors.SizeNWSE;
            _rightTopThumb = new Thumb();
            _rightTopThumb.HorizontalAlignment = HorizontalAlignment.Right;
            _rightTopThumb.VerticalAlignment = VerticalAlignment.Top;
            _rightTopThumb.Cursor = Cursors.SizeNESW;
            _rightBottomThumb = new Thumb();
            _rightBottomThumb.HorizontalAlignment = HorizontalAlignment.Right;
            _rightBottomThumb.VerticalAlignment = VerticalAlignment.Bottom;
            _rightBottomThumb.Cursor = Cursors.SizeNWSE;
            _leftbottomThumb = new Thumb();
            _leftbottomThumb.HorizontalAlignment = HorizontalAlignment.Left;
            _leftbottomThumb.VerticalAlignment = VerticalAlignment.Bottom;
            _leftbottomThumb.Cursor = Cursors.SizeNESW;
            _grid = new Grid();
            _grid.Children.Add(_leftThumb);
            _grid.Children.Add(_topThumb);
            _grid.Children.Add(_rightThumb);
            _grid.Children.Add(_bottomThumb);
            _grid.Children.Add(_lefTopThumb);
            _grid.Children.Add(_rightTopThumb);
            _grid.Children.Add(_rightBottomThumb);
            _grid.Children.Add(_leftbottomThumb);
            AddVisualChild(_grid);
            foreach (Thumb thumb in _grid.Children)
            {
                thumb.Width = 16;
                thumb.Height = 16;
                thumb.Background = Brushes.Green;
                thumb.Template = new ControlTemplate(typeof(Thumb))
                {
                    VisualTree = GetFactory(new SolidColorBrush(Colors.White))
                };
                thumb.DragDelta += Thumb_DragDelta;
            }
        }
        protected override Visual GetVisualChild(int index)
        {
            return _grid;
        }
        protected override int VisualChildrenCount
        {
            get
            {
                return 1;
            }
        }
        protected override Size ArrangeOverride(Size finalSize)
        {
            //直接給grid布局,grid內(nèi)部的thumb會(huì)自動(dòng)布局。
            _grid.Arrange(new Rect(new Point(-_leftThumb.Width / 2, -_leftThumb.Height / 2), new Size(finalSize.Width + _leftThumb.Width, finalSize.Height + _leftThumb.Height)));
            return finalSize;
        }
        //拖動(dòng)邏輯
        private void Thumb_DragDelta(object sender, DragDeltaEventArgs e)
        {
            var c = _adornedElement as FrameworkElement;
            var thumb = sender as FrameworkElement;
            double left, top, right, bottom, width, height;
            if (thumb.HorizontalAlignment == HorizontalAlignment.Left)
            {
                right = c.Margin.Right;
                left = c.Margin.Left + e.HorizontalChange;
                width =(double.IsNaN(c.Width)?c.ActualWidth:c.Width)- e.HorizontalChange;
            }
            else
            {
                left = c.Margin.Left;
                right = c.Margin.Right - e.HorizontalChange;
                width = (double.IsNaN(c.Width) ? c.ActualWidth : c.Width )+ e.HorizontalChange;
            }

            if (thumb.VerticalAlignment == VerticalAlignment.Top)
            {
                bottom = c.Margin.Bottom;
                top = c.Margin.Top + e.VerticalChange;
                height = (double.IsNaN(c.Height) ? c.ActualHeight : c.Height) - e.VerticalChange;

            }
            else
            {
                top = c.Margin.Top;
                bottom = c.Margin.Bottom - e.VerticalChange;
                height = (double.IsNaN(c.Height) ? c.ActualHeight : c.Height )+ e.VerticalChange;
            }
            if (thumb.HorizontalAlignment != HorizontalAlignment.Center)
            {
                if (width >= 0)
                {
                    c.Margin = new Thickness(left, c.Margin.Top, right, c.Margin.Bottom);
                    c.Width = width;
                }
            }
            if (thumb.VerticalAlignment != VerticalAlignment.Center)
            {
                if (height >= 0)
                {
                    c.Margin = new Thickness(c.Margin.Left, top, c.Margin.Right, bottom);
                    c.Height = height;
                }
            }
        }
        //thumb的樣式
        FrameworkElementFactory GetFactory(Brush back)
        {
            var fef = new FrameworkElementFactory(typeof(Ellipse));
            fef.SetValue(Ellipse.FillProperty, back);
            fef.SetValue(Ellipse.StrokeProperty, new SolidColorBrush((Color)ColorConverter.ConvertFromString("#999999")));
            fef.SetValue(Ellipse.StrokeThicknessProperty, (double)2);
            return fef;
        }
    }

四、使用示例

示例代碼如下:

xml

<Grid>
    <Border  x:Name="border"  Width="200" Height="200"  Background="Gray" ></Border>
</Grid>

在窗口或控件的Loaded事件中添加裝飾器:
cs

private void window_Loaded(object sender, RoutedEventArgs e)
{
    var layer = AdornerLayer.GetAdornerLayer(border);
    layer.Add(new GridAdorner(border));
}

效果預(yù)覽:

在這里插入圖片描述

總結(jié)

以上就是今天要講的內(nèi)容,本文講述了Grid中控件縮放的方法與實(shí)現(xiàn),與Canvas的實(shí)現(xiàn)大部分是相同的,唯一的區(qū)別就是設(shè)置Margin,總得來(lái)說(shuō)還是比較容易實(shí)現(xiàn)的,最終呈現(xiàn)的效果也是比較不錯(cuò)的。

到此這篇關(guān)于C# wpf Grid中實(shí)現(xiàn)控件拖動(dòng)調(diào)整大小的示例代碼的文章就介紹到這了,更多相關(guān)C# wpf Grid拖動(dòng)調(diào)整大小內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#程序員統(tǒng)計(jì)自己的代碼行數(shù)

    C#程序員統(tǒng)計(jì)自己的代碼行數(shù)

    這篇文章給大家講解了下作為程序員如何統(tǒng)計(jì)自己寫(xiě)過(guò)的代碼的行數(shù),這個(gè)也是證明自己程序員能力的一個(gè)表現(xiàn),一起來(lái)看下。
    2017-12-12
  • 基于C#實(shí)現(xiàn)磁性吸附窗體

    基于C#實(shí)現(xiàn)磁性吸附窗體

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)磁性吸附窗體,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • C#仿QQ聊天窗口

    C#仿QQ聊天窗口

    這篇文章主要為大家詳細(xì)介紹了C#仿QQ聊天窗口,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C#多線程編程中的鎖系統(tǒng)(四):自旋鎖

    C#多線程編程中的鎖系統(tǒng)(四):自旋鎖

    這篇文章主要介紹了C#多線程編程中的鎖系統(tǒng)(四):自旋鎖,本文講解了基礎(chǔ)知識(shí)、自旋鎖示例、SpinLock等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • C#解決Excel邊框樣式無(wú)法復(fù)制及格式刷功能

    C#解決Excel邊框樣式無(wú)法復(fù)制及格式刷功能

    在運(yùn)行數(shù)據(jù)表數(shù)據(jù)導(dǎo)出到 EXCEL 數(shù)據(jù)輸出時(shí)遇到了一個(gè)問(wèn)題,開(kāi)發(fā)者設(shè)計(jì)了單行細(xì)線下邊框的輸出模板,但是邊框的樣式無(wú)法復(fù)制,所以本文給大家介紹了C#解決Excel邊框樣式無(wú)法復(fù)制及格式刷功能,需要的朋友可以參考下
    2024-09-09
  • C#實(shí)現(xiàn)子類(lèi)與父類(lèi)的相互轉(zhuǎn)換

    C#實(shí)現(xiàn)子類(lèi)與父類(lèi)的相互轉(zhuǎn)換

    這篇文章主要介紹了C#實(shí)現(xiàn)子類(lèi)與父類(lèi)的相互轉(zhuǎn)換,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • c# Task任務(wù)的取消方式

    c# Task任務(wù)的取消方式

    文章介紹了如何在C#中使用CancellationTokenSource和CancellationToken來(lái)取消任務(wù),通過(guò)Task.Run方法和CancellationToken參數(shù),可以控制任務(wù)的執(zhí)行,并在需要時(shí)取消它們,文章還討論了CancellationToken參數(shù)的重要性
    2024-12-12
  • 剖析設(shè)計(jì)模式編程中C#對(duì)于組合模式的運(yùn)用

    剖析設(shè)計(jì)模式編程中C#對(duì)于組合模式的運(yùn)用

    這篇文章主要介紹了設(shè)計(jì)模式編程中C#對(duì)于組合模式的運(yùn)用,理論上來(lái)說(shuō)組合模式包含抽象構(gòu)件、樹(shù)葉構(gòu)件和樹(shù)枝構(gòu)件三個(gè)角色,需要的朋友可以參考下
    2016-02-02
  • Unity Shader實(shí)現(xiàn)2D游戲迷霧

    Unity Shader實(shí)現(xiàn)2D游戲迷霧

    這篇文章主要為大家詳細(xì)介紹了Unity Shader實(shí)現(xiàn)2D游戲迷霧,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • c# 控件截圖的簡(jiǎn)單實(shí)例

    c# 控件截圖的簡(jiǎn)單實(shí)例

    這篇文章介紹了c# 控件截圖的簡(jiǎn)單實(shí)例,有需要的朋友可以參考一下
    2013-10-10

最新評(píng)論

红原县| 泸西县| 上林县| 泽库县| 竹溪县| 曲阳县| 舞阳县| 新河县| 峨眉山市| 延津县| 莆田市| 曲周县| 鹤峰县| 麦盖提县| 密云县| 资兴市| 哈巴河县| 土默特右旗| 桃园市| 永和县| 迁安市| 永善县| 城市| 广汉市| 灌云县| 凤山市| 平南县| 凤冈县| 洛阳市| 沂水县| 嘉义市| 闸北区| 中卫市| 若尔盖县| 克什克腾旗| 顺平县| 鄂托克前旗| 重庆市| 浮梁县| 游戏| 昌乐县|