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.