2014-08-20 2 views
1

Я работаю над редактором уровня игры в WPF, используя C#.Как я могу использовать функцию 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».

Я хочу повторно использовать ту же функцию для каждого элемента управления изображением, которую я могу легко назначить с помощью атрибута MouseDown в XAML. Тем не менее, я не знаю, как сказать изнутри функции, которую вызвал контроль, или как получить доступ к свойству этого элемента управления, например, «.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); 
    } 

Я попытался с помощью «отправителя», так как я думал, что может быть объектом, который называется функцией, но возвратила ошибку. Я также попытался вызвать функцию с помощью функции «texture_click (this)», но это тоже не было хорошо. Это были, по общему признанию, полные выстрелы в темноте, поэтому я не был удивлен.

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

+0

'sender' должен быть объектом, который поднял событие. Какую ошибку вы получили? Вы убедились, что вы передаете 'object sender' в соответствующий тип управления? – Basic

+1

какая у вас ошибка? – Rang

+0

Ошибка: «объект» не содержит определения для «Источник». @Basic: Я не понял ваш вопрос о типе управления, пока не прочитал ответ МакГарнагле ниже. Я думаю, что бит «отправитель как изображение» - это то, о чем вы говорили. –

ответ

2

Вы просто должны бросить параметр sender к типу управления (изображения в данном случае):

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; 
     } 
     // ... 
    } 
} 

Заметим, что это (манипулируя элементы пользовательского интерфейса из кода -behind) не является идеальным способом написания приложения WPF. Обычно вы делаете что-то вроде этого, используя существующий элемент управления (например, ToggleButton) и переписывая его ControlTemplate так, чтобы его визуальное состояние отображало границу. Но я понимаю, что это глоток ...

+0

Это то, что я искал - спасибо. Я пытался получить доступ к «sender.Source», но это вызывало ошибку, из-за которой я думал, что искал не то место. Я не знал, что должен был указать «отправитель как изображение». –

+0

Ваш совет о том, как это сделать, меня интригует. С фоном в игре и веб-дизайне я не очень много работал с формами окон, и до сих пор я приближался к WPF так же, как писал Javascript/jQuery. –

Смежные вопросы