Как я могу подключить привязку для ImageSource? - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь включить изображение окружной печати в свой WPF Window и привязать источник к свойству BitmapImage, но изображение вообще не отображается. Я также хочу нажать на печать и использовать событие LeftMouseButtonDown, чтобы изменить первое изображение на семь других изображений с задержкой в ​​две секунды между каждым изменением.

Я опробовал приемы, описанные в [этом сообщении StackOverflow] ( Как связать источник изображения? , но я все еще не могу получить первое изображение для отображения).

Определение изображения в MainWindow.xaml:

<Image x:Name="imag_CountySeal" Margin="0,60,0,80" Grid.Row="0" 
    Grid.Column="0"
    Source="{Binding ImageSource, UpdateSourceTrigger=PropertyChanged,Mode=OneWay}"
    MouseLeftButtonDown="Mouse_Down_Seal"
    Width="165" Height="165" Visibility="Visible" />

Определение класса со свойством ImageSource и событиями PropertyChanged:

public class CountySeals : INotifyPropertyChanged
{
    private BitmapImage _ImageSource;
    public BitmapImage ImageSource
    {
        get { return _ImageSource; }
        set
        {
            _ImageSource = value;
            OnPropertyChanged(new PropertyChangedEventArgs("ImageSource"));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, e);
        }
    }
}

Логика в начале MainWindow.xaml.cs для установки ImageSource для первого изображения:

public partial class MainWindow : Window
{
    CountySeals seals;

    public MainWindow()
    {
        InitializeComponent();
        seals = new CountySeals();
        seals.ImageSource = new BitmapImage(new Uri(@"C:\Users\billw\Documents\Visual Studio 2015\Projects\Images\seal_l transparent.png", UriKind.Absolute));
        SizeChanged += new SizeChangedEventHandler(Window_SizeChanged);
        StateChanged += new EventHandler(Window_StateChanged);
        LocationChanged += new EventHandler(Window_LocationChanged);

Mouse_Down_Seal код в MainWindow.xaml.cs:

private void Mouse_Down_Seal(object sender, MouseButtonEventArgs e)
{
    seals.ImageSource = new BitmapImage(new Uri(@"C:\Users\billw\Documents\Visual Studio 2015\Projects\Images\seal_2 transparent.png", UriKind.Absolute));
    Thread.Sleep(2000);
    seals.ImageSource = new BitmapImage(new Uri(@"C:\Users\billw\Documents\Visual Studio 2015\Projects\Images\seal_3 transparent.png", UriKind.Absolute));
    Thread.Sleep(2000);
    seals.ImageSource = new BitmapImage(new Uri(@"C:\Users\billw\Documents\Visual Studio 2015\Projects\Images\seal_4 transparent.png", UriKind.Absolute));
    Thread.Sleep(2000);
    seals.ImageSource = new BitmapImage(new Uri(@"C:\Users\billw\Documents\Visual Studio 2015\Projects\Images\seal_5 transparent.png", UriKind.Absolute));
    Thread.Sleep(2000);
    seals.ImageSource = new BitmapImage(new Uri(@"C:\Users\billw\Documents\Visual Studio 2015\Projects\Images\seal_6 transparent.png", UriKind.Absolute));
    Thread.Sleep(2000);
    seals.ImageSource = new BitmapImage(new Uri(@"C:\Users\billw\Documents\Visual Studio 2015\Projects\Images\seal_7 transparent.png", UriKind.Absolute));
    Thread.Sleep(2000);
    seals.ImageSource = new BitmapImage(new Uri(@"C:\Users\billw\Documents\Visual Studio 2015\Projects\Images\seal_8 transparent.png", UriKind.Absolute));
}

Как я могу подключить Binding для ImageSource?

1 Ответ

0 голосов
/ 07 января 2019

Вам нужно установить печати в качестве вашего MainWindow DataContext:

public MainWindow()
{
    InitializeComponent();
    seals = new CountySeals();
    this.DataContext = seals; // <---------
    ... etc ...

ОБНОВЛЕНИЕ: Ваша проблема с отображением растровых изображений - это совершенно отдельная проблема. Ваш обработчик мыши вызывается в потоке GUI, но затем вы связываете этот поток с помощью команд Task.Sleep, чтобы у него никогда не было возможности обновить изображение. Фактически, вы обнаружите, что все ваше приложение будет зависать, пока все это происходит. Вам нужно назначить ImageSource и выполнять спящие операции и т. Д. В отдельном потоке ... и правильный способ сделать это в C # - с помощью Задач (за очень, очень небольшим исключением, вы никогда не должны вызывать Thread.Sleep() в C #). Вам также необходимо добавить код, чтобы проверить, выполняется ли уже задание, а затем сначала отменить его, если это так. Нечто подобное должно сработать:

private Task DisplayTask;
private CancellationTokenSource CancelSource;

private void Image_MouseDown(object sender, MouseButtonEventArgs e)
{
    // cancel any existing task and wait for it to finish
    if (this.CancelSource != null)
    {
        this.CancelSource.Cancel();
        try
        {
            this.DisplayTask.Wait(this.CancelSource.Token);
        }
        catch (OperationCanceledException)
        {
            // catches the expected exception here
        }

    }

    // start a new task
    this.CancelSource = new CancellationTokenSource();
    this.DisplayTask = Task.Run(DisplayImages);
}

private async Task DisplayImages()
{
    seals.ImageSource = new BitmapImage(new Uri(@"C:\Users\billw\Documents\Visual Studio 2015\Projects\Images\seal_2 transparent.png", UriKind.Absolute));
    await Task.Delay(TimeSpan.FromSeconds(2), this.CancelSource.Token);
    seals.ImageSource = new BitmapImage(new Uri(@"C:\Users\billw\Documents\Visual Studio 2015\Projects\Images\seal_3 transparent.png", UriKind.Absolute));
    await Task.Delay(TimeSpan.FromSeconds(2), this.CancelSource.Token);
    ... etc ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...