I have created help content for input parameters on a dockpane which shows up when the user hovers over the info icon to the left of the input parameter as a tooltip. I would like for the tooltip to show up not on the dockpane but to the right of the dockpane. I figured the best way to achieve this would be to set the HorizontalOffset of the tooltip to the width of the dockpane. To achieve this, I need to know the width of the user's dockpane. I figured it would be best to dynamically retrieve the width of the dockpane and use that as the HorizontalOffset of the tooltip. So how do I access the width of a dockpane. I checked the 'pane' help but it has no width property. Uma Harano Wolfgang Kaiser
Try this - eventually you should change the PaneWidth datatype to double. Note that the snippet below tracks any changes to the width by using the SizeChanged event, covering the case when the operator resizes the dockpane after its initial display.
<SPAN class="keyword token">private</SPAN> <SPAN class="keyword token">bool</SPAN> _initSizeChange <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">true</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="keyword token">private</SPAN> <SPAN class="keyword token">double</SPAN> <SPAN class="token function">GetWidth</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">{</SPAN> <SPAN class="keyword token">if</SPAN> <SPAN class="punctuation token">(</SPAN>_initSizeChange<SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">{</SPAN> _initSizeChange <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">false</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="keyword token">base</SPAN><SPAN class="punctuation token">.</SPAN>Content<SPAN class="punctuation token">.</SPAN>SizeChanged <SPAN class="operator token">+</SPAN><SPAN class="operator token">=</SPAN> Content_SizeChanged<SPAN class="punctuation token">;</SPAN> <SPAN class="punctuation token">}</SPAN> <SPAN class="keyword token">return</SPAN> <SPAN class="keyword token">base</SPAN><SPAN class="punctuation token">.</SPAN>Content<SPAN class="punctuation token">.</SPAN>ActualWidth<SPAN class="punctuation token">;</SPAN> <SPAN class="punctuation token">}</SPAN> <SPAN class="keyword token">private</SPAN> <SPAN class="keyword token">void</SPAN> <SPAN class="token function">Content_SizeChanged</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="keyword token">object</SPAN> sender<SPAN class="punctuation token">,</SPAN> System<SPAN class="punctuation token">.</SPAN>Windows<SPAN class="punctuation token">.</SPAN>SizeChangedEventArgs e<SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">{</SPAN> <SPAN class="keyword token">if</SPAN> <SPAN class="punctuation token">(</SPAN>e<SPAN class="punctuation token">.</SPAN>WidthChanged<SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">{</SPAN> PaneWidth <SPAN class="operator token">=</SPAN> <SPAN class="token function">GetWidth</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="token function">ToString</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="punctuation token">}</SPAN> <SPAN class="punctuation token">}</SPAN> <SPAN class="keyword token">public</SPAN> <SPAN class="keyword token">string</SPAN> _paneWidth <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">string</SPAN><SPAN class="punctuation token">.</SPAN>Empty<SPAN class="punctuation token">;</SPAN> <SPAN class="keyword token">public</SPAN> <SPAN class="keyword token">string</SPAN> PaneWidth <SPAN class="punctuation token">{</SPAN> <SPAN class="keyword token">get</SPAN> <SPAN class="punctuation token">{</SPAN> <SPAN class="keyword token">if</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="keyword token">string</SPAN><SPAN class="punctuation token">.</SPAN>IsNullOrEmpty <SPAN class="punctuation token">(</SPAN>_paneWidth<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">{</SPAN> _paneWidth <SPAN class="operator token">=</SPAN> <SPAN class="token function">GetWidth</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="token function">ToString</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="punctuation token">}</SPAN> <SPAN class="keyword token">return</SPAN> _paneWidth<SPAN class="punctuation token">;</SPAN> <SPAN class="punctuation token">}</SPAN> <SPAN class="keyword token">set</SPAN> <SPAN class="punctuation token">{</SPAN> <SPAN class="token function">SetProperty</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="keyword token">ref</SPAN> _paneWidth<SPAN class="punctuation token">,</SPAN> <SPAN class="keyword token">value</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">=</SPAN><SPAN class="operator token">></SPAN> PaneWidth<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="punctuation token">}</SPAN> <SPAN class="punctuation token">}</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
This works perfectly Wolf. Thank you.
Wolfgang Kaiser This works well as a button but how do I set it as a property? I attempted to set it as below:
<SPAN class="keyword token">public</SPAN> <SPAN class="keyword token">string</SPAN> _paneWidth <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">base</SPAN><SPAN class="punctuation token">.</SPAN>Content<SPAN class="punctuation token">.</SPAN>ActualWidth<SPAN class="punctuation token">.</SPAN><SPAN class="token function">ToString</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="keyword token">public</SPAN> <SPAN class="keyword token">string</SPAN> PaneWidth <SPAN class="punctuation token">{</SPAN> <SPAN class="keyword token">get</SPAN> <SPAN class="punctuation token">{</SPAN> <SPAN class="keyword token">return</SPAN> _paneWidth<SPAN class="punctuation token">;</SPAN> <SPAN class="punctuation token">}</SPAN> <SPAN class="keyword token">set</SPAN> <SPAN class="punctuation token">{</SPAN> <SPAN class="token function">SetProperty</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="keyword token">ref</SPAN> _paneWidth<SPAN class="punctuation token">,</SPAN> <SPAN class="keyword token">value</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">=</SPAN><SPAN class="operator token">></SPAN> PaneWidth<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="punctuation token">}</SPAN> <SPAN class="punctuation token">}</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
But I get the error "keyword base is not available in the current context"
Thanks for the response. I would rather use the MVVM pattern and avoid code behind.
Maybe something like this. I'm manually positioning the tooltip relative to the view's outermost grid.
<SPAN class="token tag"><SPAN class="token tag"><SPAN class="punctuation token"><</SPAN>Grid</SPAN> <SPAN class="attr-name token"><SPAN class="namespace token">x:</SPAN>Name</SPAN><SPAN class="attr-value token"><SPAN class="punctuation token">=</SPAN><SPAN class="punctuation token">"</SPAN>mainGrid<SPAN class="punctuation token">"</SPAN></SPAN><SPAN class="punctuation token">></SPAN></SPAN> <SPAN class="token tag"><SPAN class="token tag"><SPAN class="punctuation token"><</SPAN>Button</SPAN> <SPAN class="attr-name token"><SPAN class="namespace token">x:</SPAN>Name</SPAN><SPAN class="attr-value token"><SPAN class="punctuation token">=</SPAN><SPAN class="punctuation token">"</SPAN>myButton<SPAN class="punctuation token">"</SPAN></SPAN> <SPAN class="attr-name token">Content</SPAN><SPAN class="attr-value token"><SPAN class="punctuation token">=</SPAN><SPAN class="punctuation token">"</SPAN>Test<SPAN class="punctuation token">"</SPAN></SPAN> <SPAN class="attr-name token">Width</SPAN><SPAN class="attr-value token"><SPAN class="punctuation token">=</SPAN><SPAN class="punctuation token">"</SPAN>100<SPAN class="punctuation token">"</SPAN></SPAN> <SPAN class="attr-name token">Height</SPAN><SPAN class="attr-value token"><SPAN class="punctuation token">=</SPAN><SPAN class="punctuation token">"</SPAN>40<SPAN class="punctuation token">"</SPAN></SPAN><SPAN class="punctuation token">></SPAN></SPAN> <Button.ToolTip> <SPAN class="token tag"><SPAN class="token tag"><SPAN class="punctuation token"><</SPAN>ToolTip</SPAN> <SPAN class="attr-name token"><SPAN class="namespace token">x:</SPAN>Name</SPAN><SPAN class="attr-value token"><SPAN class="punctuation token">=</SPAN><SPAN class="punctuation token">"</SPAN>popup1<SPAN class="punctuation token">"</SPAN></SPAN> <SPAN class="attr-name token">Placement</SPAN><SPAN class="attr-value token"><SPAN class="punctuation token">=</SPAN><SPAN class="punctuation token">"</SPAN>Custom<SPAN class="punctuation token">"</SPAN></SPAN><SPAN class="punctuation token">></SPAN></SPAN>test<SPAN class="token tag"><SPAN class="token tag"><SPAN class="punctuation token"></</SPAN>ToolTip</SPAN><SPAN class="punctuation token">></SPAN></SPAN> </Button.ToolTip> <SPAN class="token tag"><SPAN class="token tag"><SPAN class="punctuation token"></</SPAN>Button</SPAN><SPAN class="punctuation token">></SPAN></SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
<SPAN class="keyword token">public</SPAN> <SPAN class="token function">Dockpane1View</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">{</SPAN> <SPAN class="token function">InitializeComponent</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> popup1<SPAN class="punctuation token">.</SPAN>CustomPopupPlacementCallback <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">CustomPopupPlacementCallback</SPAN><SPAN class="punctuation token">(</SPAN>placePopup<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="punctuation token">}</SPAN> <SPAN class="keyword token">public</SPAN> CustomPopupPlacement<SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="token function">placePopup</SPAN><SPAN class="punctuation token">(</SPAN>Size popupSize<SPAN class="punctuation token">,</SPAN> Size targetSize<SPAN class="punctuation token">,</SPAN> Point offset<SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">{</SPAN> <SPAN class="keyword token">double</SPAN> scaleX <SPAN class="operator token">=</SPAN> <SPAN class="number token">1</SPAN><SPAN class="punctuation token">;</SPAN> PresentationSource source <SPAN class="operator token">=</SPAN> PresentationSource<SPAN class="punctuation token">.</SPAN><SPAN class="token function">FromVisual</SPAN><SPAN class="punctuation token">(</SPAN>mainGrid<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="comment token">// Get the display scale (e.g. 200%)</SPAN> <SPAN class="keyword token">if</SPAN> <SPAN class="punctuation token">(</SPAN>source <SPAN class="operator token">!=</SPAN> <SPAN class="keyword token">null</SPAN><SPAN class="punctuation token">)</SPAN> scaleX <SPAN class="operator token">=</SPAN> source<SPAN class="punctuation token">.</SPAN>CompositionTarget<SPAN class="punctuation token">.</SPAN>TransformToDevice<SPAN class="punctuation token">.</SPAN>M11<SPAN class="punctuation token">;</SPAN> Point newPoint <SPAN class="operator token">=</SPAN> myButton<SPAN class="punctuation token">.</SPAN><SPAN class="token function">TranslatePoint</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">Point</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> mainGrid<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> CustomPopupPlacement placement1 <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">CustomPopupPlacement</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">Point</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN>mainGrid<SPAN class="punctuation token">.</SPAN>ActualWidth <SPAN class="operator token">-</SPAN> newPoint<SPAN class="punctuation token">.</SPAN>X<SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">*</SPAN> scaleX<SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">+</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="number token">5</SPAN> <SPAN class="operator token">*</SPAN> scaleX<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> PopupPrimaryAxis<SPAN class="punctuation token">.</SPAN>Vertical<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> CustomPopupPlacement placement2 <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">CustomPopupPlacement</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">Point</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN>newPoint<SPAN class="punctuation token">.</SPAN>X <SPAN class="operator token">*</SPAN> scaleX <SPAN class="operator token">*</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">-</SPAN> popupSize<SPAN class="punctuation token">.</SPAN>Width <SPAN class="operator token">-</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="number token">5</SPAN> <SPAN class="operator token">*</SPAN> scaleX<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> PopupPrimaryAxis<SPAN class="punctuation token">.</SPAN>Horizontal<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> CustomPopupPlacement<SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">]</SPAN> placements <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">CustomPopupPlacement</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="punctuation token">{</SPAN> placement1<SPAN class="punctuation token">,</SPAN> placement2 <SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="keyword token">return</SPAN> placements<SPAN class="punctuation token">;</SPAN> <SPAN class="punctuation token">}</SPAN> <SPAN class="punctuation token">}</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
Hi Marvis,
There is no easy way to do this right now, however, there is a workaround since the 'Content' property is 'protected internal' and hence accessible from any derived class (which includes your dockpane). To test this i added a button to my test dockpane class (CmdWidthTest) that calls the added 'GetFrameworkElement' function. Needless to say you can make this a property as well. To access the width use the 'ActualWidthProperty'.
<SPAN class="keyword token">public</SPAN> System<SPAN class="punctuation token">.</SPAN>Windows<SPAN class="punctuation token">.</SPAN>FrameworkElement <SPAN class="token function">GetFrameworkElement</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">{</SPAN> <SPAN class="keyword token">return</SPAN> <SPAN class="keyword token">base</SPAN><SPAN class="punctuation token">.</SPAN>Content<SPAN class="punctuation token">;</SPAN> <SPAN class="punctuation token">}</SPAN> <SPAN class="keyword token">public</SPAN> ICommand CmdWidthTest <SPAN class="punctuation token">{</SPAN> <SPAN class="keyword token">get</SPAN> <SPAN class="punctuation token">{</SPAN> <SPAN class="keyword token">return</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">RelayCommand</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">=</SPAN><SPAN class="operator token">></SPAN> <SPAN class="punctuation token">{</SPAN> <SPAN class="keyword token">var</SPAN> ui <SPAN class="operator token">=</SPAN> <SPAN class="token function">GetFrameworkElement</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> MessageBox<SPAN class="punctuation token">.</SPAN><SPAN class="token function">Show</SPAN><SPAN class="punctuation token">(</SPAN>$<SPAN class="string token">@"Width: {ui.ActualWidth}"</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="punctuation token">}</SPAN> <SPAN class="punctuation token">}</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
wpf - Pushing read-only GUI properties back into ViewModel - Stack Overflow
Yes. My problem is that I need to know the width of the dockpane so that I can set the margin/horizontal offset value. This way, the tooltip always appears just to the right of the dockpane even if it gets resized by the user.
Hi Marvis Kisakye,
For right alignment with offset, I think using HorizontalAlignment = "Right" with margin property for offset will do the job for you.
<SPAN class="token tag"><SPAN class="token tag"><SPAN class="punctuation token"><</SPAN>Grid</SPAN> <SPAN class="attr-name token">Margin</SPAN><SPAN class="attr-value token"><SPAN class="punctuation token">=</SPAN><SPAN class="punctuation token">"</SPAN>5,0<SPAN class="punctuation token">"</SPAN></SPAN> <SPAN class="attr-name token">ScrollViewer.VerticalScrollBarVisibility</SPAN><SPAN class="attr-value token"><SPAN class="punctuation token">=</SPAN><SPAN class="punctuation token">"</SPAN>Auto<SPAN class="punctuation token">"</SPAN></SPAN> <SPAN class="attr-name token">ScrollViewer.HorizontalScrollBarVisibility</SPAN><SPAN class="attr-value token"><SPAN class="punctuation token">=</SPAN><SPAN class="punctuation token">"</SPAN>Auto<SPAN class="punctuation token">"</SPAN></SPAN><SPAN class="punctuation token">></SPAN></SPAN> <Grid.RowDefinitions> <SPAN class="token tag"><SPAN class="token tag"><SPAN class="punctuation token"><</SPAN>RowDefinition</SPAN> <SPAN class="attr-name token">Height</SPAN><SPAN class="attr-value token"><SPAN class="punctuation token">=</SPAN><SPAN class="punctuation token">"</SPAN>Auto<SPAN class="punctuation token">"</SPAN></SPAN><SPAN class="punctuation token">/></SPAN></SPAN> <SPAN class="token tag"><SPAN class="token tag"><SPAN class="punctuation token"><</SPAN>RowDefinition</SPAN> <SPAN class="attr-name token">Height</SPAN><SPAN class="attr-value token"><SPAN class="punctuation token">=</SPAN><SPAN class="punctuation token">"</SPAN>Auto<SPAN class="punctuation token">"</SPAN></SPAN><SPAN class="punctuation token">/></SPAN></SPAN> <SPAN class="token tag"><SPAN class="token tag"><SPAN class="punctuation token"><</SPAN>RowDefinition</SPAN> <SPAN class="attr-name token">Height</SPAN><SPAN class="attr-value token"><SPAN class="punctuation token">=</SPAN><SPAN class="punctuation token">"</SPAN>Auto<SPAN class="punctuation token">"</SPAN></SPAN><SPAN class="punctuation token">/></SPAN></SPAN> <SPAN class="token tag"><SPAN class="token tag"><SPAN class="punctuation token"><</SPAN>RowDefinition</SPAN> <SPAN class="attr-name token">Height</SPAN><SPAN class="attr-value token"><SPAN class="punctuation token">=</SPAN><SPAN class="punctuation token">"</SPAN>Auto<SPAN class="punctuation token">"</SPAN></SPAN><SPAN class="punctuation token">/></SPAN></SPAN> <SPAN class="token tag"><SPAN class="token tag"><SPAN class="punctuation token"><</SPAN>RowDefinition</SPAN> <SPAN class="attr-name token">Height</SPAN><SPAN class="attr-value token"><SPAN class="punctuation token">=</SPAN><SPAN class="punctuation token">"</SPAN>Auto<SPAN class="punctuation token">"</SPAN></SPAN><SPAN class="punctuation token">/></SPAN></SPAN> <SPAN class="token tag"><SPAN class="token tag"><SPAN class="punctuation token"><</SPAN>RowDefinition</SPAN> <SPAN class="attr-name token">Height</SPAN><SPAN class="attr-value token"><SPAN class="punctuation token">=</SPAN><SPAN class="punctuation token">"</SPAN>*<SPAN class="punctuation token">"</SPAN></SPAN><SPAN class="punctuation token">/></SPAN></SPAN> <SPAN class="token tag"><SPAN class="token tag"><SPAN class="punctuation token"><</SPAN>RowDefinition</SPAN> <SPAN class="attr-name token">Height</SPAN><SPAN class="attr-value token"><SPAN class="punctuation token">=</SPAN><SPAN class="punctuation token">"</SPAN>40<SPAN class="punctuation token">"</SPAN></SPAN><SPAN class="punctuation token">/></SPAN></SPAN> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <SPAN class="token tag"><SPAN class="token tag"><SPAN class="punctuation token"><</SPAN>ColumnDefinition</SPAN> <SPAN class="attr-name token">Width</SPAN><SPAN class="attr-value token"><SPAN class="punctuation token">=</SPAN><SPAN class="punctuation token">"</SPAN>*<SPAN class="punctuation token">"</SPAN></SPAN> <SPAN class="punctuation token">/></SPAN></SPAN> </Grid.ColumnDefinitions> <SPAN class="token tag"><SPAN class="token tag"><SPAN class="punctuation token"><</SPAN>Grid</SPAN> <SPAN class="attr-name token">Grid.Row</SPAN><SPAN class="attr-value token"><SPAN class="punctuation token">=</SPAN><SPAN class="punctuation token">"</SPAN>0<SPAN class="punctuation token">"</SPAN></SPAN> <SPAN class="attr-name token">Margin</SPAN><SPAN class="attr-value token"><SPAN class="punctuation token">=</SPAN><SPAN class="punctuation token">"</SPAN>5<SPAN class="punctuation token">"</SPAN></SPAN> <SPAN class="attr-name token">HorizontalAlignment</SPAN><SPAN class="attr-value token"><SPAN class="punctuation token">=</SPAN><SPAN class="punctuation token">"</SPAN>Right<SPAN class="punctuation token">"</SPAN></SPAN> <SPAN class="punctuation token">></SPAN></SPAN> .......<SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
FrameworkElement.Margin Property (System.Windows) | Microsoft Docs
Alignment, Margins, and Padding Overview - WPF | Microsoft Docs
Or you can create the margin property and shift the item based on the size of your control as well.
That could be easier I think.
Signed in members can post, follow updates, and more. New here? Register a free account.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.