it-swarm.com.ru

Нажмите Event для изображения WPF

Я портирую старое приложение WinForms Desktop на WPF. Графический интерфейс приложения использует WinForm PictureBox для отображения изображений. В старом приложении WinForms также были обработчики событий OnClick для всех PictureBox. Нажатие на изображения на самом деле сделал что-то важное. Теперь, когда я заново делаю пользовательский интерфейс в WPF, я выяснил в соответствии с this , что эквивалентом для элемента управления WinForm PictureBox является WPF Image. Однако когда я открыл панель свойств для WPF Image, события click не было, поэтому я не смог написать обработчик события click, как в WinForms. 

Итак, не могли бы вы сказать мне, что можно сделать, чтобы получить эквивалент WinForm PictureBox и событие click в WPF? Я хочу отображать изображения и обрабатывать их каждый раз, когда пользователь нажимает на изображение.

6
The Vivandiere

В WPF каждый элемент управления имеет свой шаблон по умолчанию (как он выглядит), но вы можете легко изменить эти шаблоны и сделать элементы управления такими, как вы хотите. Это облегчает выбор управления по его функциональности и делает его таким, каким вы хотите. В вашем случае вы хотите Click, поэтому вы выбираете Button и меняете его Template

<Window ...>
    <Window.Resources>
        <Style TargetType="{x:Type Button}" x:Key="ImageButtonStyle">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <ContentPresenter/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <Button Style="{StaticResource ImageButtonStyle}" Click="ImageButton_Click">
        <Image Source="..."/>
    </Button>
</Window>

С указанным выше XAML Image будет вашим Button

ПРАВКА

Ниже вы можете найти упрощенную версию привязки/изменения Image.Source, где все выполняется в MainWindow, но в основном в WPF вы не манипулируете элементами управления, а связываете их свойства с помощью Binding и манипулируете этими свойствами. Обычно вы создаете выделенный класс (ViewModel). Вашему классу необходимо реализовать INofityPropertyChanged interface, DataContext должен быть установлен соответствующим образом, а привязанное свойство должно вызывать событие INofityPropertyChanged.PropertyChanged при каждом изменении его значения (таким образом вы уведомляете пользовательский интерфейс для обновления значения)

public partial class MainWindow : Window, INotifyPropertyChanged
{
   public MainWindow()
   {
      InitializeComponent();
      DataContext = this;
   }

   private ImageSource _myImageSource;

   public ImageSource MyImageSource
   {
      get { return _myImageSource; }
      set
      {
          _myImageSource = value;
          OnPropertyChanged("MyImageSource");
      }
   }

   private void ImageButton_Click(object sender, RoutedEventArgs e)
   {
       this.MyImageSource = new BitmapImage(...); //you change source of the Image
   }

   public event PropertyChangedEventHandler PropertyChanged;

   private void OnPropertyChanged(string propertyName)
   {
      var handler = PropertyChanged;
      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
   }    
}

и в XAML:

<Button Style="{StaticResource ImageButtonStyle}" Click="ImageButton_Click" Width="..." Height="...">
    <Image Source="{Binding MyImageSource}"/>
</Button>
8
dkozl

Просто добавьте событие MouseDown к вашему изображению, вот так

<Image x:Name=aPicture Source="mypic.jpg" MouseDown="aPicture_MouseDown"/>

который должен добавить это к вашему коду позади

private void aPicture_MouseDown(object sender, MouseEventArgs e)
{
   //do something here
}
15
CJK

Может быть, MouseLeftButtonDown будет более подходящим.

1
AngelBlueSky