C# отображение изображения в WPF из пользовательского класса, отличного от MainWindow: Window

Здравствуйте, у меня есть простое окно WPF, и я хочу загрузить и отобразить изображение логотипа для определенного элемента "Изображение". Следующий код работает отлично, и я могу отобразить логотип.

namespace WPFexample
{
    public partial class MainWindow : Window
    { 
        public MainWindow()
        {
            InitializeComponent();
            var uri = new Uri("pack://application:,,,/Assets/Logo.png");
            LogoImage.Source = new BitmapImage(uri);
        }
    }
}

Теперь я хочу создать еще один класс, который может получить доступ к графическому интерфейсу и отобразить оттуда логотип:

namespace WPFexample
{
    public partial class MainWindow : Window
    { 
        public MainWindow()
        {
            InitializeComponent();                
        }
    }

    class MyClass
    {
        private void myCustomDisplay()
        {
            var uri = new Uri("pack://application:,,,/Assets/Logo.png");
            // How can I call the LogoImage.Source from this place??
        }
    }
}

Сначала я думал, что смогу это сделать, но ничего не произошло:

class MyClass
{   
    private void myCustomDisplay()
    {
        MainWindow MainWindowClassRef = new MainWindow();
        var uri = new Uri("pack://application:,,,/Assets/Logo.png");
        MainWindowClassRef.LogoImage.Source = new BitmapImage(uri);
    }
}

Любое предложение, почему я не могу отобразить это?

Это тоже не работает:

namespace WPFexample
{
    public partial class MainWindow : Window
    { 
        public MainWindow()
        {
            InitializeComponent();                
        }
        public void DisplayInGUI()
        {
            var uri = new Uri("pack://application:,,,/Assets/ITLLogo.png");
            LogoImage.Source = new BitmapImage(uri);            
        }
    }

    class MyClass:MainWindow 
    {
        public void myCustomDisplay()
        {
            DisplayInGUI()
        }
    }
}

2 ответа

Решение

Чтобы получить доступ к члену (например, свойству или методу) экземпляра MainWindow, вы можете привести MainWindow свойство текущего Application экземпляр вашего класса MainWindow.

Так, например, вызвать MainWindow DisplayInGUI() метод по

((MainWindow)Application.Current.MainWindow).DisplayInGUI();

Вы, вероятно, хотите передать фактическое изображение логотипа в качестве параметра в метод, подобный

public partial class MainWindow : Window
{ 
    ...
    public void SetLogoImage(ImageSource image)
    {
        LogoImage.Source = image;
    }
}

и назовите это так:

((MainWindow)Application.Current.MainWindow).SetLogoImage(
    new BitmapImage(new Uri("pack://application:,,,/Assets/ITLLogo.png")));

РЕДАКТИРОВАТЬ: вызвать метод из другого потока, как это:

var mainWindow = (MainWindow)Application.Current.MainWindow;
mainWindow.Dispatcher.Invoke(() => mainWindow.DisplayInGUI());

MyClass должен иметь свойство или поле с именем LogoImage. "Частичное" ключевое слово указывает на то, что MainWindow имеет часть определения своего класса где-то еще - вероятно, в классе с именем MainWindow.xaml. Я бы попытался просмотреть этот файл и переместить соответствующие его части в MyClass.

Это также может помочь MyClass косвенным образом получить UIElement. Если вы попросите IDE создать его как UserControl в новом файле, он, вероятно, также сгенерирует для вас какой-нибудь заполнитель xaml.

Другие вопросы по тегам