一,Application类的启动和停止.
1,设定启动方式,可以在两个启动的Main函数中选择启动函数.
2,可以设定窗口关闭的方式:
3,事件说明:
StartUp:传递命令行参数,在Run运行后,窗口运行前.
private void TestApp_Startup(object sender, StartupEventArgs e) { MessageBox.Show(e.Args[0]); }
Exit:传递一个ShutDown传递的参数
private void TestApp_Exit(object sender, ExitEventArgs e) { MessageBox.Show(e.ApplicationExitCode.ToString()); }
4,事件列表
5,使用触发程序:事件+触发加On来进行重写.可以执行这个函数来触发事件.
protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e);//一般触发对应事件. MessageBox.Show("overrided StartUp");//自定义内容 }
6,显示初始窗口的方法:
使用代码实现:
SplashScreen splashScreen = new SplashScreen("制胶机.png"); splashScreen.Show(false);//false则由代码控制何时消失. splashScreen.Close( new TimeSpan(1000));
二,单实列应用程序的架构:
1,单实列应用程序的框架:
2,引用Microsoft.VisualBasic.dll程序集
- 创建启动类:
public class Startup { [STAThread] public static void Main(string[] args) { SingleInstanceApplicationWrapper wrapper = new SingleInstanceApplicationWrapper(); wrapper.Run(args); } }
- 在启动类中,创建一个单实列的应用程序类:
public class SingleInstanceApplicationWrapper : Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase { public SingleInstanceApplicationWrapper() { // Enable single-instance mode. this.IsSingleInstance = true; } // Create the WPF application class. private WpfApp app; protected override bool OnStartup(//首次启动创建应用程序,并且注册表注册 Microsoft.VisualBasic.ApplicationServices.StartupEventArgs e) { string extension = ".testDoc"; string title = "SingleInstanceApplication"; string extensionDescription = "A Test Document"; // Uncomment this line to create the file registration. // In Windows Vista, you'll need to run the application // as an administrator. FileRegistrationHelper.SetFileAssociation( extension, title + "." + extensionDescription); app = new WpfApp(); app.Run(); return false; } // Direct multiple instances protected override void OnStartupNextInstance(//再次启动的时候,(二次启动, //进行自定义的文档显示操作. Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs e) { if (e.CommandLine.Count > 0) { app.ShowDocument(e.CommandLine[0]); } } }
- 创建WPF app类
public class WpfApp : System.Windows.Application { protected override void OnStartup(System.Windows.StartupEventArgs e) {//重载启动触发函数. base.OnStartup(e); // Load the main window. DocumentList list = new DocumentList(); this.MainWindow = list; list.Show();//显示主窗体 // Load the document that was specified as an argument. if (e.Args.Length > 0) ShowDocument(e.Args[0]);//显示分文档. } // An ObservableCollection is a List that provides notification // when items are added, deleted, or removed. It's preferred for data binding. private ObservableCollection<DocumentReference> documents = new ObservableCollection<DocumentReference>();//一个带通知的集合类. public ObservableCollection<DocumentReference> Documents { get { return documents; } set { documents = value; } } public void ShowDocument(string filename) { try { Document doc = new Document(); DocumentReference docRef = new DocumentReference(doc, filename); doc.LoadFile(docRef); //调用doc窗体方法显示文件内容. doc.Owner = this.MainWindow;//设定其主体. doc.Show(); doc.Activate();//使其成为活动窗口. Documents.Add(docRef);//在其中添加信息.并且通知到主窗口. } catch { MessageBox.Show("Could not load document."); } } }
- 这里的一个问题是如
- 何将显示和数据绑定: 利用数据绑定功能.将listbox的源绑定到了一个集合的某个元素上.
- 研究下注册表关联启动函数:
namespace SingleInstanceApplication { /// <summary> /// Interaction logic for DocumentList.xaml /// </summary> public partial class DocumentList : System.Windows.Window { public DocumentList() { InitializeComponent(); // Show the window names in a list. lstDocuments.DisplayMemberPath = "Name"; lstDocuments.ItemsSource = ((WpfApp)Application.Current).Documents; } } }
如何用程序关联某个后缀的文档到其注册表之中?使用该函数创建注册表的子项和名值对. valueName=0,表示默认.
private static void SetValue(RegistryKey root, string subKey, object keyValue, string valueName) { bool hasSubKey = ((subKey != null) && (subKey.Length > 0)); RegistryKey key = root; try { if (hasSubKey) key = root.CreateSubKey(subKey); key.SetValue(valueName, keyValue); } finally { if (hasSubKey && (key != null)) key.Close(); } }
1,创建了一个.testdoc 子项:
2,创建了一个关联:
3,创建了一个icon关联
4, 创建一个Applications 关联项
整体程序如下://用于创建关联当前应用程序和某个后缀名.
public class FileRegistrationHelper { public static void SetFileAssociation(string extension, string progID) { // Create extension subkey SetValue(Registry.ClassesRoot, extension, progID); // Create progid subkey string assemblyFullPath = System.Reflection.Assembly.GetExecutingAssembly().Location.Replace("/", @""); StringBuilder sbShellEntry = new StringBuilder(); sbShellEntry.AppendFormat(""{0}" "%1"", assemblyFullPath); SetValue(Registry.ClassesRoot, progID + @"shellopencommand", sbShellEntry.ToString()); StringBuilder sbDefaultIconEntry = new StringBuilder(); sbDefaultIconEntry.AppendFormat(""{0}",0", assemblyFullPath); SetValue(Registry.ClassesRoot, progID + @"DefaultIcon", sbDefaultIconEntry.ToString()); // Create application subkey SetValue(Registry.ClassesRoot, @"Applications" + Path.GetFileName(assemblyFullPath), "", "NoOpenWith"); } private static void SetValue(RegistryKey root, string subKey, object keyValue) { SetValue(root, subKey, keyValue, null); } private static void SetValue(RegistryKey root, string subKey, object keyValue, string valueName) { bool hasSubKey = ((subKey != null) && (subKey.Length > 0)); RegistryKey key = root; try { if (hasSubKey) key = root.CreateSubKey(subKey); key.SetValue(valueName, keyValue); } finally { if (hasSubKey && (key != null)) key.Close(); } } }
另外,当使用文档关联的时候,打开文档的路径就是第一个参数.
三 提示权限的应用程序清单文件:
<?xml version="1.0" encoding="utf-8"?> <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"> <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> </requestedPrivileges> </security> </trustInfo> </assembly>
四,程序集资源
1, 如何生成程序集的资源? 在文件上设定resource即可,然后会生成一个资源文件:
其中,资源文件之类的都在obj/debug/文件夹下面:
2,检索资源:
- 使用Application.GetResourceStream(new uri(“images/winter.jpg”,urikend.Relative));
StreamResourceInfo sri = Application.GetResourceStream(new Uri("images/tempsnip.jpg", UriKind.Relative)); MessageBox.Show(sri.ContentType); Stream str = sri.Stream;
3,使用另一种方式获取资源
Assembly assembly = Assembly.GetAssembly(this.GetType());
string resourceName = assembly.GetName().Name + ".g";//注意 Name()后面的Name不可少.
ResourceManager rm = new ResourceManager(resourceName, assembly);
using (
ResourceSet set = rm.GetResourceSet(CultureInfo.InvariantCulture, true, true)
)
{
foreach(DictionaryEntry res in set)
{
MessageBox.Show(res.Value.ToString());
}
}
其中:集合里面 key 是 路径 Value 是一个 非托管Stream对象.代表资源的字节流.
4,使用专有类访问资源:
比如 <Image Source = “Images/Blue hills.jpg”></Image>
或者使用
img.Source = new BitmapImage(new Uri(“images/winter.jpg”,UriKind.Relative));
pack://application:,,,/+ images/winter.jpg.
5,内容文件 ;将文件设为content,并且选择始终复制.则可以像资源文件一样使用它.
6,本地化(略).