WPF中跨项目调用窗体导致资源丢失,求解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF中跨项目调用窗体导致资源丢失,求解决相关的知识,希望对你有一定的参考价值。

我有一个解决方案TINI,其中有两个项目,一个项目为主程序MAIN,一个为即时通讯程序CHAT,现在我遇到这样一个问题:

我再主程序中引用了CHAT项目,同时也using了CHAT的名称空间,但是当我实例化CHAT中的任何一个窗体时,都会报错 在“System.Windows.StaticResourceExtension”上提供值时引发了异常。” ,我仔细的看了错误跟踪,发现是找不到某一个资源了,但是这个项目单独运行的时候是没有问题的,资源都正常,我想可能是我引用CHAT项目时其中的APP.xaml并没有引用过来或者被主程序的APP.xaml给覆盖了,所以导致了这个问题,但是我没有办法解决,希望大家能帮帮忙。

我通过一个按钮调用,代码为:

CHAT.MainWindow frm_mm = new CHAT.MainWindow();
frm_mm.Show();

参考技术A 的确,正如楼主所说,被引用的项目的app实效了。因为一个解决方案只允许有一个app,即控制全局样式的东东。你把chat的app里的样式都提取出来,放到一个ResourceDictionary里面。然后在主项目中引用(或者说合并)这个ResourceDictionary就行了。
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source= "/程序集A;Component/MYDictionary.xaml "/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
或直接引用
<Application.Resources>
<ResourceDictionary Source= "/程序集A;Component/MYDictionary.xaml "/>
</Application.Resources>追问

OK,这个问题经过您的指点已经解决了,但是还有一个问题,现在我的资源字典已经处理完毕了,也就是说我的样式全部都是正确的,但是会提示一个新的异常“System.Windows.Baml2006.TypeConverterMarkupExtension”,错误跟踪说无法找到图片文件,如“找不到资源“images/only.png”,同样是单独运行的时候是正常的,一旦实例化窗体就会出错,我猜想可能是各项目间调用的包的名称不同导致的,请问是否有解决的方法?谢谢您的指教!

追答

图片等资源的路径与资源字典的路径格式一致就行。
我尝试了下应该是行的。

本回答被提问者采纳
参考技术B 碰到类似为题, 使用DynamicResource替换Static...解决的

WPF 窗体在Alt+Tab中隐藏

问题: 

     近段时间由于项目上的需求,需要在WPF中使用COM组件,并且由于软件界面设计等等原因,需要将部分控件显示在COM组件之上,由于WindowsFormsHost的一些原因,导致继承在WPF中的Winform控件或者COM组件总是置于顶层,覆盖其他WPF元素。

  为了解决样式布局问题,这里我采用了父子窗体方式实现,使用定位方式将子窗体置于父窗体的合适位置:

  

  这样,解决了设计上的问题,但是新的问题随之又来了:使用Alt+Tab、或者任务管理器等等可以在Taskbar中看到多个窗体缩略图,如图:

      

 

  这样十分的影响用户体验,并且软件的其他窗口也可能被用户关掉,降低软件的用户体验。

如何解决: 

  我们只需要将需要隐藏Alt+Tab窗体的  ShowInTaskbar 属性设置为 False,并且把该子窗体的Owner属性设置为对应的父窗体引用 即可

<Window x:Class="Test.RevealModelFunctionMenu"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        WindowStyle="None"
        BorderBrush="Transparent" 
        BorderThickness="0"
      ShowInTaskbar="False"
        AllowsTransparency="True"
        Background="Transparent"
        Title="FunctionMenu" Height="165" Width="420">

 

   来一张隐藏后的效果图:

    

PS:

 1. WindowsFormsHost is always the most top from WPF element  

    

According to MSDN (Layout Considerations for the WindowsFormsHost Element)

 A hosted Windows Forms control is drawn in a separate HWND, so it is always drawn on top of WPF elements.

This is a design limitation

   2.   WindowsFormsHost 的布局注意事项

以上是关于WPF中跨项目调用窗体导致资源丢失,求解决的主要内容,如果未能解决你的问题,请参考以下文章

winform 添加wpf 窗体怎么使用

WPF窗口与windowsForm窗体之间的问题,怎么调用close()

wpf应用程序设置窗体背景图片

wpf应用程序设置窗体背景图片

Vue项目中跨域问题的解决

WPF 窗体在Alt+Tab中隐藏