我在用户控件的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,但我宁愿得到用户控件内的坐标。
答案 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属性 - 甚至是整个网格本身。