`
xqf222
  • 浏览: 124898 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

WPF后台动态调用样式文件

 
阅读更多

应用场合:如果您的WPF应用程序设置WPF运行一个实例代码后,App.xaml文件中对样式资源字典文件的引用将失效.

解决办法1:在App.xaml.cs文件中用反射动态调用另外一个DLL项目中的样式文件即可

详细操作介绍如下:

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);
//启动登陆窗体,

MainWindow myWindow = new MainWindow();

myWindow.Show();
}

}

}

2、ButtonStyle.xaml样式文件内容如下:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!--按钮样式-->
<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、MainWindow.xaml文件内容如下:

<Window x:Class="WpfUI.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Content="Button" Style="{StaticResource RedButtonStyle}" Height="23" HorizontalAlignment="Left" Margin="102,66,0,0" Name="button1" VerticalAlignment="Top" Width="75" />
</Grid>
</Window>

4、运行程序后发现按钮样式RedButtonStyle总提示找不到

5、 解决办法如下:

第一步:新建一个Windows--类库项目WpfThems,将ButtonStyle.xaml拷贝过去, 设置ButtonStyle.xaml文件的属性生成操作为 "Page",之后生成WpfThems.dll文件

第二步:在当前项目WpfUI中添加WpfThems项目引用

第三步:修改App.xaml.cs 文件代码:添加一个函数LoadStyleResource并修改OnStartup函数内容。修改后的App.xaml.cs文件内容如下:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;
//添加引用
using System.Diagnostics;
using System.IO;
using System.Reflection;

namespace WpfUI
{
/// <summary>
/// App.xaml 的交互逻辑
/// </summary>
public partial class App : Application
{

public App()
{
}

/// <summary>
/// 设置WpfUI项目中的App.xaml的文件属性中"生成操作"为"无"
/// 设置WpfThemes项目中的ButtonStyle.xaml的文件属性中"生成操作"为"Page"
/// </summary>
[STAThread]
public static void Main()
{
App myApp = new App();
myApp.ShutdownMode = ShutdownMode.OnExplicitShutdown;
myApp.Run();
}

/// <summary>
/// 重载应用程序启动函数
/// </summary>
/// <param name="e"></param>
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);
//动态调用样式文件
LoadStyleResource();

//启动窗体
MainWindow myWindow = new MainWindow();
myWindow.Show();
}
private void LoadStyleResource()
{
Assembly assembly = Assembly.LoadFrom("WpfThemes.dll");
string packUri = @"/WpfThemes;component/ButtonStyle.xaml";
ResourceDictionary myResourceDictionary = Application.LoadComponent(new Uri(packUri, UriKind.Relative)) as ResourceDictionary;
this.Resources.MergedDictionaries.Add(myResourceDictionary);
}
}
}

解决办法2:在每个窗体的xaml文件中添加对指定样式文件的引用

<Window.Resources>

<ResourceDictionary>

<ResourceDictionary.MergedDictionaries>

<ResourceDictionary Source="ButtonStyle.xaml"/>

</ResourceDictionary.MergedDictionaries>

</ResourceDictionary>

</Window.Resources>

详细工程项目请到我的下载资源中下载: http://download.csdn.net/detail/xqf222/5582575
分享到:
评论

相关推荐

    WPF动态调用资源文件

    在Windows Presentation Foundation(WPF)框架中,动态调用资源文件是一种常见的技术,它使得开发者能够在运行时根据需求加载和应用不同的资源。标题中的“WPF动态调用资源文件”特指在WPF应用程序中,如何根据用户...

    WPF 字体图标(FontAwesome、IconFont)简单使用源码

    4. **动态改变图标**:你可以根据需要动态改变TextBlock的Text属性,以实现不同的图标。 除了基本的使用,还可以进行更高级的拓展,如: - **结合数据绑定**:你可以将Unicode值存储在ViewModel中,通过数据绑定...

    WPF调用WCF服务

    WPF的主要特点包括数据绑定、样式和模板、控件和布局系统以及媒体和图形支持等。 WCF,则是.NET框架中的一个服务导向架构,主要用于构建分布式应用系统。它提供了一种统一的方式,可以创建、配置、部署和管理服务,...

    一个简单的基于C#实现的Windows Service 服务的程序例子代码

    Windows Service是一种在后台运行的应用程序,它们不依赖用户界面,通常用于执行周期性任务或提供系统级功能。C#提供了System.ServiceProcess命名空间,使得开发Windows Service变得相对简单。 首先,我们需要在C#...

    WPF与JS简单交互

    在提供的压缩包文件中,我们可以看到一些关键的文件,如`App.config`(应用程序配置文件)、`.xaml.cs`文件(WPF的后台逻辑代码)和`.xaml`文件(WPF的用户界面定义)。`H5交互.csproj`是项目的解决方案文件,包含...

    WPF自定义软键盘

    WPF自定义软键盘的特点是其灵活性和可定制性,开发者可以根据自己的需求调整键盘布局、样式和功能。 在WPF中实现自定义软键盘,主要涉及以下几个关键知识点: 1. **XAML**:XAML是WPF的核心部分,用于声明式地定义...

    WPF海康摄像头程序显示

    在WPF应用中,我们需要引用这些库,并调用相应的API函数。 在集成SDK时,首先要在项目中添加对海康SDK的引用。这通常涉及到将DLL文件添加到项目的引用列表中。然后,我们需要创建一个类或模块来封装与SDK相关的操作...

    WPF用Cefsharp和JS互调

    4. 可能还包含CSS和JavaScript资源文件,用于定制网页样式和行为。 通过学习和实践这些示例,开发者可以掌握如何在WPF应用中集成Web功能,以及如何实现C#和JavaScript之间的高效通信,提升应用程序的用户体验和功能...

    WPF 仿苹果 菜单栏源码

    这涉及到读写配置文件,以及动态修改控件样式的能力。 5. **响应式设计**:为了适应不同屏幕尺寸和分辨率,确保应用的可访问性和可用性,我们需要考虑响应式布局。WPF提供了多种布局管理器,如`Grid`、`StackPanel`...

    WPF写的Dicom浏览器demo

    WPF允许开发者使用XAML语言来描述用户界面,并支持数据绑定、样式和模板,使程序设计更加灵活和高效。 **DICOM标准介绍** DICOM标准定义了一种格式,用于包含医学成像数据,如CT、MRI和X光图像,以及相关的患者信息...

    Camera.rar_WPF 拍照_camera wpf_wpf camera_wpf 摄像头对焦_wpf调用摄像头

    WPF是一种基于XAML的UI框架,它提供了丰富的图形渲染、数据绑定、多媒体支持和强大的样式与模板系统。利用WPF,开发者可以构建出美观且功能强大的应用程序。 2. **调用摄像头** 在WPF中,我们可以使用`...

    WPF ProgressBar的使用示例

    `this.Dispatcher.Invoke` 方法是WPF提供的一个关键工具,它允许我们在非UI线程中调用UI线程上的方法。这个方法接收一个Delegate作为参数,这个Delegate包含了需要在UI线程上执行的代码。在我们的例子中,我们可能会...

    wpf图片切换

    在给定的文件列表中,我们看到了`ListBoxItemStyle.xaml`,这可能是用来定义`ListBox`项的样式,我们可以利用`ListBox`控件来展示一系列图片,允许用户通过滚动或滑动来浏览。在`ListBoxItemStyle.xaml`中,你可以...

    C# FTP操作最全类 WPF实现

    它基于XAML语言,可以创建可自定义、分离的UI元素,并支持数据绑定、样式和模板。 3. **FTPHelper类**: "FTPHelper"是一个实用的C#类,它封装了FTP相关的操作,如连接、登录、文件和目录管理等。这个类通常包含...

    WPf经典教程 共享一下

    2. **数据绑定**:WPF的强大之处在于数据绑定,允许UI元素直接与后台数据模型关联,实现数据驱动的UI更新。 3. **样式与模板**:使用样式(Styles)和控件模板(ControlTemplates)可以实现UI的统一和可复用性。 **...

    WPF技术框架进行VisionMaster二次开发控件应用实例

    例如,可以创建一个新的UserControl,通过XAML定义其外观和交互,然后在后台代码中实现VisionMaster的API调用,将视觉检测的结果实时显示在自定义控件上。 **数据绑定与MVVM模式** 在WPF中,数据绑定是连接UI和...

    WPF 管理系统源码分享.7z

    10. **多线程处理**:WPF支持后台线程更新UI,通过Dispatcher对象确保UI操作的正确性。 11. **动画和效果**:WPF提供了丰富的动画库,可以为用户界面添加过渡效果和动态行为。 12. **国际化和本地化**:利用...

    WPF UDP通信实例源码

    在WPF应用中,我们通常会创建一个MainWindow.xaml文件来定义UI布局,并在对应的MainWindow.xaml.cs文件中处理后台逻辑。 对于UDP通信,我们需要使用System.Net.Sockets命名空间中的UdpClient类。UdpClient提供了...

    wpf异步加载5w控件_wpf控件_wfp_pleasefu4_

    为了解决这个问题,WPF引入了异步编程模型,允许开发者在后台线程上执行耗时操作,同时保持UI的流畅更新。 `async` 和 `await` 关键字是C#中实现异步编程的核心工具。`async` 修饰符标记了一个方法可以异步执行,而...

Global site tag (gtag.js) - Google Analytics