亚洲精品久久国产精品37p,亚洲av无码av制服另类专区,午夜直播免费看,玩弄人妻少妇500系列视频,无码人妻久久久一区二区三区

裝飾器學(xué)習(xí)心得

裝飾器學(xué)習(xí)心得

0 界定

裝飾器能夠用于給表明的控制加上一些裝飾設(shè)計(jì)的實(shí)際效果;

1 實(shí)際效果

1 選中

電腦鼠標(biāo)按住獲得當(dāng)今點(diǎn)

   startPoint = parameter.GetPosition(Application.Current.MainWindow);

伴隨著電腦鼠標(biāo)挪動(dòng)獲得未尾點(diǎn),持續(xù)再次畫矩形框

 Point tempEndPoint = parameter.GetPosition(Application.Current.MainWindow);

1.1 畫臨時(shí)性矩形框

 private void DrawRect(Point endPoint, Point startPoint)
        {
            if (selectRect == null)
            {
                selectRect = new Rectangle();
                selectRect.Fill = new SolIDColorBrush(Colors.Gray) { Opacity = 0.1 };
                selectRect.Margin = new Thickness(startPoint.X, startPoint.Y, 0, 0);
                Controls.Add(selectRect);
            }
            selectRect.Width = Math.Abs(endPoint.X - startPoint.X);
            selectRect.Height = Math.Abs(endPoint.Y - startPoint.Y);
        }

2 加上裝飾器

裝飾器是 FrameworkElement 關(guān)聯(lián)到的自定 UIElement , 裝飾器展現(xiàn)在裝飾器層中。

  • 裝飾器層是自始至終坐落于裝飾設(shè)計(jì)原素或裝飾設(shè)計(jì)原素結(jié)合以上。
  • 裝飾器一般應(yīng)用坐落于裝飾設(shè)計(jì)原素左上端的規(guī)范 3D 座標(biāo)起點(diǎn),相對(duì)性于其關(guān)聯(lián)到的原素開展精準(zhǔn)定位。
  • 裝飾器自始至終以由此可見的方法坐落于控制頂端,沒法應(yīng)用 z 次序調(diào)用。

2.1 基本加上裝飾器

基本作法一般在裝飾器層加上裝飾器后,在裝飾器時(shí)會(huì)以調(diào)用Render的方法加上實(shí)際效果

// Adorners must subclass the abstract base class Adorner.
public class SimpleCircleAdorner : Adorner
{
  // Be sure to call the base class constructor.
  public SimpleCircleAdorner(UIElement adornedElement)
    : base(adornedElement)
  {
  }

  // A common way to implement an adorner's rendering behavior is to override the OnRender
  // method, which is called by the layout system as part of a rendering pass.
  protected override void OnRender(DrawingContext drawingContext)
  {
    Rect adornedElementRect = new Rect(this.AdornedElement.DesiredSize);

    // Some arbitrary drawing implements.
    SolidColorBrush renderBrush = new SolidColorBrush(Colors.Green);
    renderBrush.Opacity = 0.2;
    Pen renderPen = new Pen(new SolidColorBrush(Colors.Navy), 1.5);
    double renderRadius = 5.0;

    // Draw a circle at each corner.
    drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopLeft, renderRadius, renderRadius);
    drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopRight, renderRadius, renderRadius);
    drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomLeft, renderRadius, renderRadius);
    drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomRight, renderRadius, renderRadius);
  }
}

2.1 裝飾器怎樣加上自定控制?

裝飾器沒有得出一個(gè)立即的方式 去加上自定控制,且裝飾器與外部的聯(lián)絡(luò)只有一個(gè)被裝飾設(shè)計(jì)的控制,那麼大家怎樣在數(shù)據(jù)可視化樹枝加上自定控制呢?

我們可以根據(jù)間接性的方式 :

The AddVisualChild method is a notification to the base class that you've acquired a new child into your collection. It doesn't actually add the child to any collection, but it lets the Visual system know that it needs to redraw. This sounds a bit funny, but it's consistent with the way the logical tree is managed as well.

Similarly, when you remove a Visual from your child collection you must call RemoveVisualChild, so the Visual system knows to stop tracking and displaying that Visual. If you'd like, and it sounds appropriate in your scenario, you don't have to use an actual collection for your child visuals. You can Simply have a member variable of type Visual, which you can think of as a collection of maximum length 1. Your implementation of GetVisualChild should return the value of that variable, and your implementation of VisualChildrenCount should probably return 0 if that variable is null, or 1 if it's non-null.

根據(jù)調(diào)用GetVisualChild方式 使數(shù)據(jù)可視化樹重繪

2.2 控制和裝飾器怎樣完成連動(dòng)實(shí)際效果

假如想完成預(yù)估的實(shí)際效果,必須裝飾器B和被裝飾設(shè)計(jì)控制A連動(dòng),例如當(dāng)A產(chǎn)生變形時(shí),B也產(chǎn)生變形

一切正常的,大家可以用A去通告B,可是裝飾器做為單獨(dú)的一層,不應(yīng)該和A造成聯(lián)絡(luò)

我們可以根據(jù)調(diào)用ArrangeOverride方式 ,當(dāng)再次排列的情況下給裝飾器內(nèi)的自定控制一個(gè)自身的尺寸(部位)

  public Rect AdonerArrange(Size finalSize)
        {
            int margin = 10;
            return new Rect(-margin, -margin, finalSize.Width   2 * margin, finalSize.Height   2 * margin);
        }

3 移動(dòng)事例

在自定控制層,大家根據(jù)裝飾器取得被裝飾器的控制

自定裝飾器控制-->裝飾器層-->被裝飾設(shè)計(jì)控制

被裝飾設(shè)計(jì)控制:grid

裝飾器層:layer

自定裝飾器控制:contentControl

 			 var layer = AdornerLayer.GetAdornerLayer(grid);
            DragDropControl contentControl = new DragDropControl(grid);
            contentControl.Background = new SolidColorBrush(Colors.Black) { Opacity = 0.1 };
            layer.Add(new ContentAdorner(grid, contentControl));

以后我們?cè)谧远ㄑb飾器控制contentControl中實(shí)際操作被裝飾設(shè)計(jì)控制grid:

        bool isCanMove = false;

        private void thumMove_DragStarted(object sender, System.Windows.Controls.Primitives.DragStartedEventArgs e)
        {
            isCanMove = true;
        }

        private void thumMove_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
        {
            if (isCanMove)
            {
                InkCanvas.SetLeft(_adornedElement, InkCanvas.GetLeft(_adornedElement)   e.HorizontalChange);
                InkCanvas.SetTop(_adornedElement, InkCanvas.GetTop(_adornedElement)   e.VerticalChange);
            }
        }

        private void thumMove_DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e)
        {
            isCanMove = false;
        }

這時(shí)大家根據(jù)contentControl控制移動(dòng)被裝飾設(shè)計(jì)的控制grid

而contentControl根據(jù)AdonerArrange方式 追隨grid開展移動(dòng)

 public Rect AdonerArrange(Size finalSize)
        {
            int margin = 10;
            return new Rect(-margin, -margin, finalSize.Width   2 * margin, finalSize.Height   2 * margin);

        }

完成了:

當(dāng)控制沒有裝飾器時(shí),并不具有移動(dòng)工作能力。

當(dāng)控制有改裝飾器裝飾時(shí),具有了移動(dòng)工作能力。

即基本裝飾器能夠加上實(shí)際效果,自定控制裝飾器能夠加上一些工作能力。

Demo:https://GitHub.com/tiancai4652/MyDecorator

評(píng)論(0條)

刀客源碼 游客評(píng)論