如何使用c#函数来访问调用它的WPF控件?

本文关键字:WPF 控件 调用 访问 何使用 函数 | 更新日期: 2023-09-27 18:18:56

我正在使用c#在WPF中制作游戏关卡编辑器。

我有一系列的图像控件来选择纹理,我希望每个图像都是可点击的,有一些可见的反馈来显示哪一个被选中。

这是其中一个图像控件,当点击它时,它会显示一个绿色的高亮边框:

<Image x:Name="tile_image1" Source="as asphalt_test.png" Stretch="Fill" HorizontalAlignment="Right" VerticalAlignment="Top" Width="50" Height="50" MouseDown="texture_click" Margin="0,93,69,0" RenderTransformOrigin="0.16,2.04"/>
<Border x:Name="tile_border" BorderBrush="Lime" BorderThickness="3" HorizontalAlignment="Right" Height="54" Margin="0,91,65,0" VerticalAlignment="Top" Width="54" Visibility="Hidden" />

我的问题涉及到"texture_click"函数。

我想为每个图像控件重用相同的函数,我可以使用XAML中的MouseDown属性轻松地分配它。然而,我不知道的是如何从函数内告诉哪个控件调用它,或者如何访问该控件的属性,如"。source"。我希望能够抓取图像的文件名,并将绿色边框的坐标移动到新选区的后面。

现在,我只是把它硬编码到第一个图像控件。单击其他图像将调用该函数,但该函数将只选择第一张图像(而不是实际单击的图像)。

// click on tile 1
private void texture_click (object sender, MouseButtonEventArgs e)
  {
  tile_border.Visibility = Visibility.Visible;
  current_tilefile = tile_image1.Source;
  string source_string = Convert.ToString (tile_image1.Source);
  int last_slash = source_string.LastIndexOf ('/');
  current_tile = source_string.Substring (last_slash + 1, 3);
  }

我尝试使用"sender",因为我认为这可能是调用函数的对象,但是返回了一个错误。我还尝试用"texture_click (this)"调用函数,但这也不好。不可否认,这些都是在黑暗中拍摄的完整照片,所以我并不感到惊讶。

我对这个软件还很陌生,所以你们能给我的任何见解都会很好。

如何使用c#函数来访问调用它的WPF控件?

您只需将sender参数强制转换为控件类型(在本例中为Image):

private void texture_click (object sender, MouseButtonEventArgs e)
{
    //tile_border.Visibility = Visibility.Visible;
    var image = sender as Image;
    if (image != null)
    {
        current_tilefile = image.Source;
        string source_string = image.Source.ToString();
        int last_slash = source_string.LastIndexOf ('/');
        current_tile = source_string.Substring (last_slash + 1, 3);
    }
}

当然,这并不能让您访问相关的边框。您可以做的一件事就是将边框转储到图像的Tag属性中:

<Image x:Name="tile_image1" ... Tag="{Binding ElementName=tile_border}" />
<Border x:Name="tile_border" ... />

然后您可以检索它,同样通过强制转换:

private void texture_click (object sender, MouseButtonEventArgs e)
{
    var image = sender as Image;
    if (image != null)
    {
        var border = image.Tag as Border;
        if (border != null)
        {
            border.Visibility = Visibility.Visible;
        }
        // ...
    }
}

注意,这(从代码后操作UI元素)并不是编写WPF应用程序的理想方式。通常情况下,您可以通过使用现有控件(如ToggleButton)并重新编写其ControlTemplate以使其IsChecked视觉状态显示边框来完成这样的操作。