2015-05-11 16 views
6

Przesyłam starą aplikację WinForms Desktop do WPF. W grafice aplikacji użyto programu WinForm PictureBox do wyświetlania obrazów. Stara aplikacja WinForms zawierała także programy obsługi zdarzeń dla wszystkich pakietów PictureBox. Kliknięcie na zdjęcia rzeczywiście zrobiło coś ważnego. Teraz, gdy ponownie robię interfejs użytkownika w WPF, dowiedziałem się, że zgodnie z this, odpowiednikiem dla kontrolki WinForm jest PictureBox to Image WPF. Jednak gdy otworzyłem panel właściwości dla WPF Image, nie było żadnego zdarzenia, które można obsłużyć, więc nie mogłem napisać obsługi zdarzeń kliknięcia, tak jak miałem w WinForm.Kliknij zdarzenie dla obrazu WPF

Czy możesz mi powiedzieć, co można zrobić, aby uzyskać odpowiednik WinForm PictureBox i jego zdarzenia kliknięcia w WPF? Chcę wyświetlać obrazy i obsługiwać skrzynkę za każdym razem, gdy użytkownik kliknie obraz.

Odpowiedz

6

W WPF każda kontrolka ma swój domyślny szablon (jak to wygląda), ale można łatwo zmienić te szablony i sprawić, że kontrolki wyglądają tak, jak chcesz. Ułatwia to kontrolę poprzez jej funkcjonalność i sprawia, że ​​wygląda tak, jak chcesz. W twoim przypadku chcesz Click więc wybrać Button i zmienić jego 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> 

Z powyższego XAML Image będzie swoją Button

EDIT

Poniżej znajdziesz uproszczoną wersję jak bind/change Image.Source gdzie wszystko jest zrobione w MainWindow, ale w zasadzie w WPF nie manipulujesz kontrolkami, ale wiążę ich właściwości za pomocą Binding i mani pulować te właściwości. Zwykle tworzysz dedykowaną klasę (ViewModel). Twój klasy trzeba zaimplementować INofityPropertyChanged interfejs DataContext musi być odpowiednio ustawiony i mienia związanego musi podnieść INofityPropertyChanged.PropertyChanged zdarzenie za każdym razem jego wartość zmienia się (jest to w jaki sposób powiadomić UI odświeżyć wartości)

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)); 
    }  
} 

w XAML:

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

Ponadto, ponieważ używa WPF, może być lepiej, jeśli używa MVVM i zamiast zdarzenia Click używa polecenia. Ale to zależy od tego, co chce osiągnąć. Powiedział, że kliknięcie zrobiło coś ważnego, więc możliwe, że Dowództwo mogłoby lepiej pasować. – Dzyann

+0

Tak więc, bierzemy przycisk i sprawiamy, że wygląda jak obraz. Czy możesz mi pokazać, jak stworzyłeś przyciski tego stylu? Ponadto, czy możliwe jest ustawienie obrazu dla przycisku obrazu z obsługi innego przycisku zamiast XAML? –

+0

Sposób użycia przycisku jest już w moim XAML. Jeśli chodzi o sposób zmiany źródła obrazu, jest on inny niż WinForm. Nie działają na kontrole w WPF. Tworzysz własność ze swoim źródłem obrazu (na przykład typu 'ImageSource'), powiąż ją z' Image.Source' używając 'Binding', a następnie manipulujesz tą właściwością, a nie kontrolą. – dkozl

10

Wystarczy dodać zdarzenie MouseDown do obrazu jak tak

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

który powinien dodać do swojej c Oda za

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

To jest dobry i prosty soln – Karan

Powiązane problemy