如何在代码后台/XAML中获取元素的x:name?

4

我有一些像下面这样的.xaml文件中的图片:

<Image x:Name="image1" Source="image1.png">
<Image.GestureRecognizers>
<TapGestureRecognizer Tapped="OnTapGestureTap" NumberOfTapsRequired="1" />
</Image.GestureRecognizers>
</Image>

<Image x:Name="image2" Source="image2.png">
<Image.GestureRecognizers>
<TapGestureRecognizer Tapped="OnTapGestureTap" NumberOfTapsRequired="1" />
</Image.GestureRecognizers>
</Image>

当点击图片时,会调用某些操作。现在在xaml.cs文件中,我需要获取哪个图片被点击以便在switch语句中使用:

    async void OnTapGestureTap(object sender, EventArgs args)
    {
        switch () //--HOW VERIFY IN SWiTCH WHICH IMAGE WAS CLICKED???
        {
            case image1:
                await Navigation.PushAsync(new Image1Page());
                break;
            case image2:
                await Navigation.PushAsync(new Image2Page());
                break;
        }
    }
5个回答

4
您可以获取原始图像名称并打开该字符串:
if (sender is Image image)
{
    switch (image.Source as FileImageSource).File) 
    {
        case "image1.png":
            Console.WriteLine("image1.png");
            break;
        case "image2.png":
            Console.WriteLine("image2.png");
            break;
    }
}

是的,这看起来很正常 +1 - TheGeneral
很好用:在image.Source后面不需要加上.File,直接使用switch (image.Source as FileImageSource)。 - Diego Venâncio

1
如果你真的想使用开关,这可能会起作用。假设发送者实际上是 "Image",名称将为 "x:Name"。
更新
尝试将发送者与图像本身进行比较。
 if(sender == image1)
      ...

原始回答

async void OnTapGestureTap(object sender, EventArgs args)
{
   if(sender is Image image)
   {
      switch (image.Name) // switch on the name
      {
         case "image1":
            await Navigation.PushAsync(new Image1Page());
            break;
         case "image2":
            await Navigation.PushAsync(new Image2Page());
            break;
      }
   }
}

Note : This is totally untested


3
x:Name 会生成一个源代码变量名,但并没有 Name 属性。 - SushiHangover
这是一个不错的尝试,但是image.Name(名称不存在),我尝试使用image.Id.toString(),但返回值类似于:“ea3719f9-9892-4b66-8225-e0662f379599”。 - Diego Venâncio
也许可以使用 switch (nameof(image)) - Conceptdev
@Conceptdev,这不是个坏主意,但我现在无法测试。 - TheGeneral

1
你可以使用 Image 中的 ClassId 属性。
<Image ClassId="image1" Source="image1.png">
   <Image.GestureRecognizers>
      <TapGestureRecognizer Tapped="OnTapGestureTap" NumberOfTapsRequired="1" />
   </Image.GestureRecognizers>
</Image>

<Image ClassId="image2" Source="image2.png">
   <Image.GestureRecognizers>
      <TapGestureRecognizer Tapped="OnTapGestureTap" NumberOfTapsRequired="1" />
   </Image.GestureRecognizers>
</Image>

而在后台,只需切换 ClassId 即可。

async void OnTapGestureTap(object sender, EventArgs args)
{
    var image = sender as Image;
    switch (image.ClassId)
    {
        case "image1":
            await Navigation.PushAsync(new Image1Page());
            break;
        case "image2":
            await Navigation.PushAsync(new Image2Page());
            break;
    }
}

image.ClassId 返回什么? - Diego Venâncio
这是一个字符串属性。 - Marko Ivanovic

0

试试这个

 async void OnTapGestureTap(object sender, EventArgs args)
{ 
  var image = sender as Image;

    switch (image) 
    {
        case image1:
            await Navigation.PushAsync(new Image1Page());
            break;
        case image2:
            await Navigation.PushAsync(new Image2Page());
            break;
    }
}

0
如果未指定StyleID,则此属性将继承x:Name值作为字符串。 x:Name是由XAML生成的字段名称。在这种情况下,有效答案是:
if (sender == image1)
{
    await Navigation.PushAsync(new Image1Page());
}
else if (sender == image2) 
{
    await Navigation.PushAsync(new Image2Page());
}

你可以通过错误信息下划线的方式获取字段的名称:

当前上下文中不存在名称为'image1'的项。

但是在XAML加载时该上下文将被创建。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接