如何使用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)"调用函数,但这也不好。不可否认,这些都是在黑暗中拍摄的完整照片,所以我并不感到惊讶。
我对这个软件还很陌生,所以你们能给我的任何见解都会很好。
您只需将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
视觉状态显示边框来完成这样的操作。