【问题标题】:How can I get the coordinates of an element within a WrapPanel?如何获取 WrapPanel 中元素的坐标?
【发布时间】:2021-12-15 08:56:30
【问题描述】:

如何获取 WrapPanel 中元素的坐标? 我已经尝试过使用 myElementInsidenList.TransformToAncestor(rootView).Transform(new Point(0, 0)) 但不起作用。

            <ScrollViewer x:Name="myScrollViewer" Background="#2B2B2B" VerticalScrollBarVisibility="Auto">
                <ScrollViewer.Template>
                    <ControlTemplate TargetType="ScrollViewer">
                        <Border CornerRadius="12" Background="{TemplateBinding Background}">
                            <ContentPresenter VerticalAlignment="Top" HorizontalAlignment="Left" />
                        </Border>
                    </ControlTemplate>
                </ScrollViewer.Template>
                <WrapPanel x:Name="nList" VerticalAlignment="Top" />
            </ScrollViewer>

More context

【问题讨论】:

  • 为什么要坐标?
  • 请花时间将上下文作为嵌入代码发布,而不是附加资源链接。代码应包含相关上下文的最小版本,以便更容易理解您的问题。目前尚不清楚您要做什么,因此无法向您建议替代解决方案。乍一看,您正在做的事情似乎过于复杂。
  • 请澄清您的具体问题或提供更多详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。
  • @Dai 我需要它来做一个动画,我将一个对象移到另一个对象上。

标签: c# wpf xaml


【解决方案1】:

您必须等待Visual 元素被渲染。否则没有位置可以检索。

还请注意,如果您的 doAnimationAndAddValue() 方法不是事件处理程序的 async 方法,则它必须返回 Task 而不是 void

只需监听FrameworkElement.Loaded 事件:

async Task doAnimationAndAddValue()
{
  TextBox targetInput = CloneXaml(cloneInputForAnimation);
  nList.Children.Add(targetInput);
  targetInput.Loaded += OnTargetInputLoaded;
}

private void OnTargetInputLoaded(object sender, EventArgs e)
{
  var targetInput = sender as FrameworkElement;
  targetInput.Loaded -= OnTargetInputLoaded;

  Point targetPositionRelativeToWrapPanel = 
    targetInput.TransformToVisual(this.nList).Transform(new Point(0, 0));

  Point targetPositionRelativeToMainWindow = 
    targetInput.TransformToVisual(this).Transform(new Point(0, 0));
}

【讨论】:

    猜你喜欢
    • 2019-09-06
    • 2013-10-09
    • 2021-11-21
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    相关资源
    最近更新 更多