在运行时在代码后面获取Grid的位置

时间:2014-07-17 04:32:54

标签: c# wpf

我在用户控件的codebehind文件中。在这个用户控件中,我有一个名为GBoard的网格。我在我的主XAML文件中创建了这个用户控件的一个实例,并将其命名为GameBoard。正如我之前所说,现在我处于代码隐藏状态,我希望获得GameBoard的X / Y位置。如果我抓住保证金,所有的值都设置为0.如果我做Canvas.GetTop(这个)它会以NaN的形式返回。我如何抓住这些坐标?我不认为这是我的代码中的一个错误,因为一切正常,它只是我似乎无法抓住坐标。

Position = new Point(Canvas.GetTop(GameBoard), Canvas.GetLeft(GameBoard));

获取值的NaN。

boardMargin = GameBoard.Margin;  

boardMargin是0,0,0,0,即使它位于屏幕的中心。

<UserControl x:Class="UserControls.Board"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         xmlns:controls="clr-namespace:UserControls"
         d:DesignHeight="300" d:DesignWidth="300">

    <Grid Name="GBoard">
        <Grid.ColumnDefinitions>
            //lots of these
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            //lots of these
        </Grid.RowDefinitions>
    </Grid>
</UserControl>

是用户控件。我为空间编辑了大量的col和row defs。

<Page x:Class="GUI.SGUI"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:controls="clr-namespace:UserControls"
  Title="SGUI" Height="1000" Width="1000">

    <Canvas x:Name="LetterCanvas">
        <controls:Board x:Name="GameBoard" Height="Auto" Canvas.Left="120" Canvas.Top="164" Width="Auto"/>
    </Canvas>
</Page>

我发现如果我从主类访问该位置,那么我可以获得坐标,如果我从用户控件的代码隐藏中访问它们,我就不能。所以,如果我必须,我可以做一些hacky,但我宁愿得到用户控件内的坐标。

2 个答案:

答案 0 :(得分:1)

你的usercontrol中的代码需要访问Canvas才能获得GameBoard的位置,因为WPF中的Canvas元素使用绝对定位。

假设LetterCanvas将成为GameBoard的父元素 - 尝试在GameBoard用户控件的代码中使用它:

double xPosition = Canvas.GetLeft(this);
double yPosition = Canvas.GetTop(this);

注意:必须从方法而不是构造函数调用。

答案 1 :(得分:-1)

在设计中的某处使用 Grid 元素。它以非常直接的方式提供有关控件位置的信息。它的工作方式类似于动态调整HTML表格的更智能版本。您可以根据需要检索任何行或列的ActualWidth和ActualHeight属性 - 甚至是整个网格本身。