Search code examples
c#wpfxamlvalidationadorner

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


Solution

  • 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.

    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