Не удается получить абсолютную позицию TextBlock в Windows 8 XAML с помощью С++/CLI

Я пытаюсь получить абсолютную позицию текстового блока, но вместо этого я просто получаю относительную позицию элемента раньше.

Вот мой код XAML:

<Grid Style="{StaticResource LayoutRootStyle}" x:Name="grid_wrapper">

    <Grid.Background>
      <ImageBrush ImageSource="Assets/background_menu.png" />
    </Grid.Background>

    <Grid x:Name="grid_main">
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="430" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <Grid Grid.Column="0" x:Name="Sidebar">
      <Grid.Background>
        <SolidColorBrush Color="#000000" Opacity="0.5" />
      </Grid.Background>

      <Grid.RowDefinitions>
        <RowDefinition Height="100" />
        <RowDefinition Height="*" />
      </Grid.RowDefinitions>

      <Grid Grid.Row="0" x:Name="grid_mainCaption">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <Button Grid.Row="0" Style="{StaticResource BackButtonStyleMain}" TabIndex="2" Margin="40,50,0,0" VerticalAlignment="Center" x:Name="backButton" Click="GoBack" IsEnabled="{Binding Frame.CanGoBack, ElementName=pageRoot}"/>
        <TextBlock x:Uid="Statistics" Margin="120,0,0,0" Text="Statistics" VerticalAlignment="Bottom" FontSize="33" Foreground="Gold" FontFamily="Assets/sui generis rg.ttf#Sui Generis"/>

      </Grid>
      <Grid x:Name="grid_captions" Grid.Row="1" Grid.Column="0" Margin="120,0,0,0">
        <Grid.RowDefinitions>
          <RowDefinition Height="auto" />
          <RowDefinition Height="auto" />
          <RowDefinition Height="auto" />
          <RowDefinition Height="auto" />
          <RowDefinition Height="auto" />
          <RowDefinition Height="auto" />
          <RowDefinition Height="auto" />
          <RowDefinition Height="auto" />
          <RowDefinition Height="auto" />
          <RowDefinition Height="auto" />
          <RowDefinition Height="auto" />
          <RowDefinition Height="auto" />
          <RowDefinition Height="auto" />
          <RowDefinition Height="auto" />
          <RowDefinition Height="auto" />
          <RowDefinition Height="auto" />
          <RowDefinition Height="auto" />
          <RowDefinition Height="auto" />
          <RowDefinition Height="auto" /> <!-- Spielstand zurücksetzen -->
        </Grid.RowDefinitions>
        <TextBlock Text="Spielstatistik" Grid.Row="0" FontSize="22" Foreground="Gold" FontFamily="Assets/sui generis rg.ttf#Sui Generis" Margin="0,70,0,70"/>
        <TextBlock Text="Insgesamte Spielzeit" Grid.Row="1" FontSize="16" FontFamily="Assets/sui generis rg.ttf#Sui Generis"/>
        <TextBlock Text="Dauer des letzten Spiels" Grid.Row="2" FontSize="16" FontFamily="Assets/sui generis rg.ttf#Sui Generis" Margin="0,20,0,0"/>
        <TextBlock Text="Dauer des längsten Spiels" Grid.Row="3" FontSize="16" FontFamily="Assets/sui generis rg.ttf#Sui Generis" Margin="0,20,0,0"/>
        <TextBlock Text="Dauer des kürzesten Spiels" Grid.Row="4" FontSize="16" FontFamily="Assets/sui generis rg.ttf#Sui Generis" Margin="0,20,0,0"/>
        <TextBlock Text="Anzahl der gewonnenen Spiele" Grid.Row="5" FontSize="16" FontFamily="Assets/sui generis rg.ttf#Sui Generis" Margin="0,20,0,0"/>
        <TextBlock Text="Anzahl der gewonnenen Turniere" Grid.Row="6" FontSize="16" FontFamily="Assets/sui generis rg.ttf#Sui Generis" Margin="0,20,0,0"/>
        <TextBlock Text="Anzahl der verlorenen Spiele" Grid.Row="7" FontSize="16" FontFamily="Assets/sui generis rg.ttf#Sui Generis" Margin="0,20,0,0"/>

        <!-- I want to have the Y-Position of this element -->
        <TextBlock x:Name="Spielstatistik" Text="Anzahl der verlorenen Turniere" Grid.Row="8" FontSize="16" FontFamily="Assets/sui generis rg.ttf#Sui Generis" Margin="0,20,0,0"/> 

        <TextBlock Text="Würfelstatistik" Grid.Row="9" FontSize="22" Foreground="Gold" FontFamily="Assets/sui generis rg.ttf#Sui Generis" Margin="0,70,0,70"/>
        <TextBlock Text="Anzahl der Würfe" Grid.Row="10" FontSize="16" FontFamily="Assets/sui generis rg.ttf#Sui Generis" Margin="0,20,0,0"/>
        <TextBlock Text="Anzahl der Pip" Grid.Row="11" FontSize="16" FontFamily="Assets/sui generis rg.ttf#Sui Generis" Margin="0,20,0,0"/>
        <TextBlock Text="Pip pro Wurf" Grid.Row="12" FontSize="16" FontFamily="Assets/sui generis rg.ttf#Sui Generis" Margin="0,20,0,0"/>
        <TextBlock Text="Eröffnungen gewonnen" Grid.Row="13" FontSize="16" FontFamily="Assets/sui generis rg.ttf#Sui Generis" Margin="0,20,0,0"/>
        <TextBlock Text="Anzahl Päsche" Grid.Row="14" FontSize="16" FontFamily="Assets/sui generis rg.ttf#Sui Generis" Margin="0,20,0,0"/>
        <TextBlock Text="Zwei Päsche hintereinander" Grid.Row="15" FontSize="16" FontFamily="Assets/sui generis rg.ttf#Sui Generis" Margin="0,20,0,0"/>
        <TextBlock Text="Drei Päsche hintereinander" Grid.Row="16" FontSize="16" FontFamily="Assets/sui generis rg.ttf#Sui Generis" Margin="0,20,0,0"/>
        <TextBlock Text="Vier Päsche hintereinander" Grid.Row="17" FontSize="16" FontFamily="Assets/sui generis rg.ttf#Sui Generis" Margin="0,20,0,0"/>
        <TextBlock Text="Fünf Päsche hintereinander" Grid.Row="18" FontSize="16" FontFamily="Assets/sui generis rg.ttf#Sui Generis" Margin="0,20,0,0"/>


      </Grid>

    </Grid>
 </Grid>

Я хочу иметь абсолютную Y-позицию текстового блока с именем "Spielstatistik". Я уже пробовал такие вещи, как следующее:

float StatisticsNew::GetYPositionFromElement(UIElement^ obj)
{
auto transform = obj->TransformToVisual(nullptr);
auto point = transform->TransformPoint(Point(0,0));
return point.Y;
}

int YPosition = (int)GetYPositionFromElement(this->Spielstatistik);

YPosition имеет значение 20. Но 20 — это просто относительная позиция к предыдущему элементу (поскольку для поля margin-top установлено значение 20).

Как получить абсолютную позицию элемента?


person Stefan Gi    schedule 14.11.2013    source источник
comment
Поддерживается ли C++/CLI в WinRT? Вы, должно быть, думаете о C++/CX?   -  person Filip Skakun    schedule 15.11.2013


Ответы (1)


Я не думаю, что существует что-то вроде абсолютной позиции, но, возможно, вы можете вызвать TransformToVisual(), передав `Window::Current::Content (при необходимости приведя) в качестве цели преобразования?

person Filip Skakun    schedule 14.11.2013
comment
Это то, что делают отладчики визуального дерева. У него могут быть некоторые проблемы с Viewboxes - я думаю, что у меня были некоторые проблемы с этим, но в остальном он должен работать нормально. - person Filip Skakun; 30.11.2013