应用场合:如果您的WPF应用程序设置WPF运行一个实例代码后,App.xaml文件中对样式资源字典文件的引用将失效.
解决办法1:在App.xaml.cs文件中用反射动态调用另外一个DLL项目中的样式文件即可
解决办法2:在每个窗体的xaml文件中添加对指定样式文件的引用(本文不做介绍)
详细操作介绍如下:
1、WPF设置只运行一个实例代码:
App.xaml文件代码如下:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="ButtonStyle.xaml"/>
</ResourceDictionary>
</Application.Resources>
</Application>
App.xaml.cs文件代码如下:
//添加引用
using System.Diagnostics;
using System.IO;
using System.Reflection;
namespace WpfUI
{
/// <summary>
/// App.xaml 的交互逻辑
/// </summary>
public partial class App : Application
{
public App()
{
}
/// <summary>
/// 要设置App.xaml的文件属性中生成操作=无
/// </summary>
[STAThread]
public static void Main()
{
App myApp = new App();
myApp.ShutdownMode = ShutdownMode.OnExplicitShutdown;
myApp.Run();
}
private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
if (e.Exception is InvalidOperationException)
e.Handled = true;
}
protected override void OnStartup(StartupEventArgs e)
{
//获取当前运行WPF程序的进程实例
Process process = Process.GetCurrentProcess();
//遍历WPF程序的同名进程组
foreach (Process p in Process.GetProcessesByName(process.ProcessName))
{
if (p.Id != process.Id && (p.StartTime - process.StartTime).TotalMilliseconds <= 0)
{
p.Kill();//关闭进程
return;
}
}
base.OnStartup(e);
//启动登陆窗体,
TestWindow myWindow = new TestWindow();
myWindow.Show();
}
}
}
2、ButtonStyle.xaml样式文件内容如下:
<ResourceDictionary
xmlns=" http://schemas.microsoft.com/winfx/2006/xaml/presentation "
xmlns:x=" http://schemas.microsoft.com/winfx/2006/xaml "
xmlns:ed=" http://schemas.microsoft.com/expression/2010/drawing ">
<!--按钮样式-->
<Style x:Key="RedButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Foreground" Value="Red"/>
<Setter Property="Background" Value="Silver"/>
<Setter Property="Height" Value="23"/>
</Style>
</ResourceDictionary>
3、TestWindow.xaml文件内容如下:
<Grid>
<Button x:Name="MyButton" Content="测试按钮" Style="{StaticResource RedButtonStyle}" Margin="144.988,8,0,0" HorizontalAlignment="Left" Width="57" FontSize="16" VerticalAlignment="Top" Height="24.687"/>
</Grid>
4、运行程序后发现按钮样式RedButtonStyle总提示找不到
5、 解决办法如下:
第一步: 新建一个Windows--类库项目WpfThems,将ButtonStyle.xaml拷贝过去,生成WpfThems.dll文件
第二步:在当前项目WpfUI中添加WpfThems项目引用
第三步:修改App.xaml.cs 文件代码:
添加一个函数
private void LoadStyleResource()
{
Assembly assembly = Assembly.LoadFrom("WpfThems.dll");
string packUri = @"/WpfThems;component/ButtonStyle.xaml");
ResourceDictionary myResourceDictionary = Application.LoadComponent(new Uri(packUri, UriKind.Relative)) as ResourceDictionary;
this.Resources.MergedDictionaries.Add(myResourceDictionary);
}
在OnStartup函数中添加上面样式加载函数的调用即可
protected override void OnStartup(StartupEventArgs e)
{
LoadAllStyleResource():
//后面的代码省略,请参考上面代码
}
分享到:
相关推荐
"WPF后台动态调用样式文件"一文对应的工程项目代码
WPF 列表选择,动态调用ResourceDictionary内资源
winform调用全局wpf资源样式,可以调用相对路径的xaml也可以调用绝对路径的xaml。
Winform与WPF窗体互相调用方法 包括Winform调用WPF窗体和WPF调用Winform窗体。
WPF后台线程更新UI---http://www.tuicool.com/articles/NbieE3M
最近尝试用wpf在后台动态添加控件,还有个滚动条效果,基本已完成,希望对大家有帮助
WPF的ListView简易操作示例,如何在代码中按需设置数据源、追加行或列。一个简单的示例说明,便于了解基本应用,供有需要的进行学习。
WPF 后台管理UI 界面
WPF XamlReader 动态Load Xaml文件,包括第三方控件及系统控件,在WPF运行时,XAML解析器公开为2个类,只要使用任何一种.NET语言写的应用程序,都可以在运行时使用XAML。通过这2个类,可以对XAML进行相关操作。
本教程是继使用HttpClient调用Web API只有的补充教程,主要讲解了如何在WPF中异步调用Web API且不阻塞主线程。
Winform调用WPF控件,演示WPF的DataGrid控件在Winform中如何调用刷新
window窗体与wpf窗体相互调用
wpf编译生成的exe文件在其他文件调用时传递参数的实现方式
WPF 后台管理UI 2 源码
对于出现在WPF程序中的各种文件的样式,都有xaml设置的方法源码,教你怎样设置它的样式,肯定会有你满意的样式。
WPF ListView 漂亮样式,自己还可以根据自己的需求进行样式修改,表头、列表都可以根据注释进行拓展,很实用
WPF中使用字体图标(IconFont、FontAwesome)的源代码,以及拓展代码。
WPF,漂亮的TabControl样式
1 wpf 中显示、隐藏虚拟键盘的实现; 2 基本功能已实现,具体还要根据实际完善; 3 主要为了测试使用