C# 在 WPF 中显示来自 MainWindow 以外的自定义 class 的图像:Window

C# display image in WPF from a custom class other than MainWindow : Window

您好,我有一个简单的 WPF window,我想在特定的 "Image" 项目上加载和显示徽标图像。以下代码完美运行,我可以显示徽标。

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

现在我想创建另一个 class,它可以访问 GUI 并从那里显示徽标:

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

MyClass 需要有一个 属性 或名为 LogoImage 的字段。 "partial" 关键字表明 MainWindow 在其他地方有其 class 定义的一部分 - 可能在一个名为 MainWindow.xaml 的 class 中。我会尝试查看该文件并将其相关部分移动到 MyClass。

它也可能有助于 MyClass 间接派生自 UIElement。如果您要求 IDE 在新文件中将其创建为 UserControl,它可能还会为您生成一些占位符 xaml。

要访问 MainWindow 实例的成员(例如 属性 或方法),您可以将当前 Application 实例的 MainWindow 属性 转换为您的 MainWindow class.

例如通过

调用 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());