Xaml
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<StackPanel HorizontalAlignment="Center" Orientation="Horizontal" VerticalAlignment="Center">
<Button Content="Load Image" Command="{Binding MyModel.CommandClickLoadImage}" VerticalAlignment="Top" Margin="10"/>
<Border BorderBrush="Gray" BorderThickness="1">
<Image Source="{Binding MyModel.ImageSource, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Height="100" Width="100" VerticalAlignment="Top"/>
</Border>
</StackPanel>
</Window>
C#
using Microsoft.Win32;
using System.Windows;
using System.Windows.Media.Imaging;
using System.Windows.Media;
using System.Windows.Input;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace WpfApp1
{
public class MainWindowModel : NotifyPropertyChanged
{
private ImageSource _imageSource;
public ImageSource ImageSource
{
get => _imageSource;
set => SetProperty(ref _imageSource, value);
}
public ICommand CommandClickLoadImage => new ClickCommand(ClickLoadImage);
public MainWindowModel()
{
}
private void ClickLoadImage(object parameter)
{
OpenFileDialog op = new OpenFileDialog();
op.Title = "Select a picture";
op.Filter = "All supported graphics|*.jpg;*.jpeg;*.png|" +
"JPEG (*.jpg;*.jpeg)|*.jpg;*.jpeg|" +
"Portable Network Graphic (*.png)|*.png";
if (op.ShowDialog() == true)
{
ImageSource = new BitmapImage(new Uri(op.FileName));
}
}
}
public partial class MainWindow : Window
{
public MainWindowModel MyModel { get; }
public MainWindow()
{
MyModel = new MainWindowModel();
// for binding
this.DataContext = this;
}
}
///// Base functionality /////
public class NotifyPropertyChanged : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
protected virtual bool SetProperty<T>(ref T field, T value, [CallerMemberName] string PropertyName = null)
{
if (Equals(field, value))
return false;
field = value;
OnPropertyChanged(PropertyName);
return true;
}
}
class ClickCommand : ICommand
{
public event EventHandler CanExecuteChanged;
private Action<object> _callback;
public ClickCommand(Action<object> callback)
{
_callback = callback;
}
public virtual void Execute(object parameter) { _callback(parameter); }
public virtual bool CanExecute(object parameter) { return true; }
}
////////////
}
Объяснение:
• При нажатии на мою кнопку
Load Image вызывается обработчик
CommandClickLoadImage и вызывается метод
ClickLoadImage в классе
MainWindowModel.
• метод
ClickLoadImage показывает системное окно для выбора фото с компьютера
• В системном окне выбрали картинку и нажимаем кнопку
Open. Системное окно закрывается и вызывается мой код:
C#
ImageSource = new BitmapImage(new Uri(op.FileName)); // показываю картинку в элементе Image