代码之家  ›  专栏  ›  技术社区  ›  Thomas van Schijndel

WPF-获取控件的位置会不断返回{0;0}

  •  5
  • Thomas van Schijndel  · 技术社区  · 8 年前

    我试图获取控件(按钮)的位置,但它一直返回{0;0}。我相信这是有原因的,但我不明白为什么会这样。

    我想要控件相对于窗口或某个容器的位置。我的按钮排列在另一个网格中。取这些按钮的边距只会得到0,0,因为它们都在网格单元内。

    我尝试的内容:

    - var point = btnTest.TransformToAncestor(mainGrid).Transform(new Point());
    - UIElement container = VisualTreeHelper.GetParent(btnTest) as UIElement;
      Point relativeLocation = btnTest.TranslatePoint(new Point(0, 0), mainGrid);
    

    我尝试将网格作为父对象,并使用画布。我尝试的每件事都给我{0,0}。当我更改 new Point 参数时,位置会发生变化。它与参数保持相同。

    我的XAML的一小部分:

        <Grid x:Name="mainGrid">
        <Grid Name="buttonGrid" Margin="105,64,98.4,97.8">
            <Grid.RowDefinitions>
                <RowDefinition Height="25"/>
                <RowDefinition Height="25"/>
                <RowDefinition Height="25"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="50"/>
                <ColumnDefinition Width="50"/>
                <ColumnDefinition Width="50"/>
            </Grid.ColumnDefinitions>
            <Button x:Name="btnTest" Grid.Row="0" Grid.Column="0" Content="Button" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top" Width="26" Height="29"/>
            <Button x:Name="btnTest2" Grid.Row="1" Grid.Column="1" Content="Button" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top" Width="26" Height="29"/>
        </Grid>
    </Grid>
    
    1 回复  |  直到 8 年前
        1
  •  8
  •   Matt Norrie    8 年前

    您的代码运行得非常好,时间问题才是关键。必须先绘制UI元素,然后才能检索位置。

    下面的代码示例显示了在构造函数中运行的点提取,结果为0,0,然后在加载的事件中运行,该事件返回所需的结果84,78。

    <Window x:Class="WpfApp7.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">
    <Grid x:Name="mainGrid">
        <Button x:Name="btnTest" Content="TileButton" HorizontalAlignment="Left" Margin="84,78,0,0" VerticalAlignment="Top" Width="109" Height="103"/>
    </Grid>
    

     public MainWindow()
        {
            InitializeComponent();
            GetPoint();
        }
    
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            GetPoint();
        }
    
        private void GetPoint()
        {
            var point = btnTest.TransformToAncestor(mainGrid).Transform(new Point());
            UIElement container = VisualTreeHelper.GetParent(btnTest) as UIElement;
            Point relativeLocation = btnTest.TranslatePoint(new Point(0, 0), mainGrid);
            MessageBox.Show($"X = {relativeLocation.X} Y = {relativeLocation.Y}");
        }