如何在Xaml中将Rectangle链接或引用到Image中以便在C#代码后面进行访问?

时间:2016-01-15 01:03:23

标签: c# xaml uwp

我在使用Windows Universal App时正在学习XAML / C#。

该程序允许在棋盘上拖放图像,棋盘是一个8行8列的网格。每个网格单元都有一个Rectangle和一个Image。拖放工作,将图像拖动到图像。在拖动开始事件和放置事件时,后面的C#代码获取图像源(在拖动开始事件上)和图像目标(在放置事件上)。源和目标都可用作开始拖动事件和放置事件的sender参数。没问题。我还希望在后面的C#代码中访问与Image在同一网格单元格中的Rectangle,如下面的XAML代码所示。

有没有办法将属性添加到Image的XAML代码中,以引用同一网格单元格中的Rectangle?

<Rectangle Grid.Row="2" Grid.Column="0" Fill="{Binding Source={StaticResource queenModel0}, Path=Color, Mode=TwoWay}" />
<Image Name="Image0" Grid.Row="2" Grid.Column="0" Source="{StaticResource imageSource}" Tapped="OnImageTapped"  AllowDrop="True"
   CanDrag="{Binding Source={StaticResource queenModel0}, Path=HasQueen, Mode=TwoWay}"
   Opacity="{Binding Source={StaticResource queenModel0}, Path=Opacity, Mode=TwoWay}"
   DragEnter ="Image_DragEnter" DragLeave="Image_DragLeave" DragOver="Image_DragOver" DragStarting="Image_DragStarting" DropCompleted="Image_DropCompleted" Drop="DropQueen" />

1 个答案:

答案 0 :(得分:0)

我至少可以想到两种可能的方法:

选项#1:

按行/列索引检索Rectangle

int row = Grid.GetRow(sender), column = Grid.GetColumn(sender);
Rectangle rectangle = GetChildForRowColumn<Rectangle>(grid1, row, column);

其中:

T GetChildForRowColumn<T>(Grid grid, int row, int column)
{
    foreach (Rectangle child in grid.Children.OfType<T>())
    {
        if (Grid.GetRow(child) == row && Grid.GetColumn(child) == column)
        {
            return child;
        }
    }
}

选项#2:

Tag属性绑定到相关的Rectangle对象:

<Rectangle x:Name="rect20" Grid.Row="2" Grid.Column="0" Fill="{Binding Source={StaticResource queenModel0}, Path=Color, Mode=TwoWay}" />
<Image Tag="{x:Reference Name=rect20}" Name="Image0" Grid.Row="2" Grid.Column="0" Source="{StaticResource imageSource}" Tapped="OnImageTapped"  AllowDrop="True"
   CanDrag="{Binding Source={StaticResource queenModel0}, Path=HasQueen, Mode=TwoWay}"
   Opacity="{Binding Source={StaticResource queenModel0}, Path=Opacity, Mode=TwoWay}"
   DragEnter ="Image_DragEnter" DragLeave="Image_DragLeave" DragOver="Image_DragOver" DragStarting="Image_DragStarting" DropCompleted="Image_DropCompleted" Drop="DropQueen" />

然后在您的代码隐藏中:

Rectangle rectangle = (Rectangle)((FrameworkElement)sender).Tag;


可能还有其他方法可以实现相同的目标,但上述内容对我来说似乎很合理。