【问题标题】:Picture not changing in WPF ControlWPF控件中的图片没有变化
【发布时间】:2016-07-17 12:13:25
【问题描述】:

我参考了this,编写了几乎相同的代码,但使用不同的语言,它没有按预期工作!
我使用 winform(C++/Cli) 作为主机 & 'WPF User Control Libaray'(C#) 作为子控件。
在 Winform 中使用 ElementHost 组件在 Winform 中集成 WPF 用户控件(PictureBox)。
基本上我想从winform按钮更改WPF控件中的图片。 它编译并运行良好。
但唯一的问题是即使图片路径正确,图片也不会改变。

下面的代码在 winform button_click 事件中

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    OpenFileDialog ^ofd = gcnew OpenFileDialog();
    WpfControlLibrary1::UserControl1 ^uc = gcnew UserControl1();
    if (ofd->ShowDialog() == Windows::Forms::DialogResult::OK)      
    uc->open(ofd->FileName);        
}

以下代码在 UserControl1.xaml.cs 中

public void open(string path)
{
    MessageBox.Show(path); //path seems to be fine
    img.Source = new BitmapImage(new Uri(path));
}

下面的代码在 UserControl1.xaml 中

<UserControl x:Class="WpfControlLibrary1.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid Margin="-54,0,0,0">
        <Image x:Name="img"  Stretch="Uniform" Opacity="1" Source="Koala.jpg"/>
    </Grid>
</UserControl>

尝试在 xaml 代码中删除源图像,但没有效果

【问题讨论】:

    标签: c# wpf winforms visual-c++ elementhost


    【解决方案1】:

    声明

    WpfControlLibrary1::UserControl1 ^uc = gcnew UserControl1();
    

    创建一个新的 UserControl1 实例。这不是您之前放入 ElementHost 的实例,因此不会显示在您的 UI 中。

    【讨论】:

    • 嗨 Clemens,感谢您的回复,我试过 WpfControlLibrary1::UserControl1 uc; uc.open(ofd-&gt;FileName); 还是一样。但看起来相同的方法在C# 中有效,您知道从winform 调用wpf 控件中的任何公共函数的任何其他方法吗?
    • 这仍然会创建一个新实例。如前所述,您必须使用先前创建的实例,即添加到 ElementHost 的实例。
    • 不错。它起作用了..但是如何使用OOP。我试过这个WpfControlLibrary1::UserControl1 ^uc;this-&gt;elementHost1-&gt;Child = nullptr; this-&gt;elementHost1-&gt;Child = uc; if (ofd-&gt;ShowDialog() ==Windows::Forms::DialogResult::OK) uc-&gt;open(ofd-&gt;FileName);its throwing error Object reference not set to an instance of an object. 我猜这里有一些愚蠢的错误!有没有办法删除以前的(第一个)实例并动态创建新的?谢谢
    • 什么地址有uc?没有?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    相关资源
    最近更新 更多