简体   繁体   English

是否可以给Adorner一个绝对位置或将其向左移动一些?

[英]Is it possible to give an Adorner an absolute position or to move it for example a bit more to the left?

At the moment I am having the problem that the displayed error goes over several labels or textboxes. 目前,我遇到的问题是显示的错误超出了几个标签或文本框。 I was hoping that I would be able to give the adorner an absolute postion. 我希望能够给装饰者一个绝对的位置。 If that is not possible than I would like to move it to the left. 如果那不可能,那么我想将其向左移动。 Now I was not able to find useful information on the internet about the positioning of adorners. 现在,我无法在互联网上找到有关装饰者位置的有用信息。 So I am wondering is there a way to change to position of an adorner? 所以我想知道是否有办法改变装饰者的位置?

I am able to paste my code here if it would help to get a solution for the positioning of the adorner. 如果能够帮助您找到装饰者位置的解决方案,则可以在此处粘贴我的代码。

All help will be appreciated 所有帮助将不胜感激

Thanks in advance 提前致谢

You should derive from the Adorner object, and override location determination logic there, which would allow you to do all kinds of tricks, including absolute / relative positioning. 您应该从Adorner对象派生,并在那里覆盖位置确定逻辑,这将使您能够进行各种技巧,包括绝对/相对定位。

public class ControlAdorner: Adorner
{
    #region Private fields

    // Utilized for caching of offset by x co-ordinate.
    private double m_OffsetX = 0d;

    // Uri    private double m_OffsetY = 0d;
    #endregion

    #region Initialization
    public ControlAdorner( UIElement adornedElement )
        : base( adornedElement )
        {

        }
    #endregion

    #region Implementation
    //Measures content.
    protected override Size MeasureOverride( Size constraint )
    {
        m_child.Measure( constraint );
        return AdornedElement.RenderSize;
    }

    //Arranges child control to the full size.
    protected override Size ArrangeOverride( Size finalSize )
    {
        m_child.Arrange( new Rect( finalSize ) );
        return m_child.RenderSize;
    }

    public override GeneralTransform GetDesiredTransform( GeneralTransform transform )
    {
        GeneralTransformGroup group = new GeneralTransformGroup();
        group.Children.Add( transform );
        group.Children.Add( new TranslateTransform( OffsetX, OffsetY ) );
        return group;
    }

    //Get visual by index.
    protected override Visual GetVisualChild( int index ) 
    {
        return m_child;
    }

    private static void OnOffsetXChanged( DependencyObject d, DependencyPropertyChangedEventArgs e )
    {
        ControlAdorner instance = (ControlAdorner)d;
        instance.OnOffsetXChanged( e );
    }

    private void OnOffsetXChanged( DependencyPropertyChangedEventArgs e )
    {
        m_OffsetX = (double)e.NewValue;
        if( OffsetXChanged != null )
        {
            OffsetXChanged( this, e );
        }
    }

    private static void OnOffsetYChanged( DependencyObject d, DependencyPropertyChangedEventArgs e )
    {
        ControlAdorner instance = (ControlAdorner)d;
        instance.OnOffsetYChanged( e );
    }

    private void OnOffsetYChanged( DependencyPropertyChangedEventArgs e )
    {
        m_OffsetY = (double)e.NewValue;
        if( OffsetYChanged \!= null )
        {
            OffsetYChanged( this, e );
        }
    }
    #endregion

    #region Events
    public event PropertyChangedCallback OffsetXChanged;
    public event PropertyChangedCallback OffsetYChanged;
    public double OffsetX
    {
        get
        {
            return m_OffsetX;
        }
        set
        {
            SetValue( OffsetXProperty, value );
        }
    }
    public double OffsetY
    {
        get
        {
            return m_OffsetY;
        }
        set
        {
            SetValue( OffsetYProperty, value );
        }
    }

    // Gets visual children count, always 1.
    protected override int VisualChildrenCount
    {
        get
        {
            return 1;
        }
    }
    #endregion

    #region Dependency properties
    public static readonly DependencyProperty OffsetXProperty = DependencyProperty.Register( 
      "OffsetX", typeof( double ), typeof( ControlAdorner ),
      new FrameworkPropertyMetadata( 0d,    
        FrameworkPropertyMetadataOptions.AffectsArrange | 
        FrameworkPropertyMetadataOptions.AffectsParentArrange, 
        new PropertyChangedCallback( OnOffsetXChanged ) ) );

    public static readonly DependencyProperty OffsetYProperty = DependencyProperty.Register( 
      "OffsetY", typeof( double ), typeof( ControlAdorner ),
      new FrameworkPropertyMetadata( 0d, 
        FrameworkPropertyMetadataOptions.AffectsArrange |
        FrameworkPropertyMetadataOptions.AffectsParentArrange, 
        new PropertyChangedCallback( OnOffsetYChanged ) ) );
    #endregion
}

http://www.artfulbits.com/technologies/winfx/adorners.aspx http://www.artfulbits.com/technologies/winfx/adorners.aspx

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM