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());
您好,我有一个简单的 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());