新聞中心
這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
WCF附加屬性技巧掌握
WCF作為一種比較新的技術(shù)工具,其中有許多東西值得我們?nèi)ド钊雽W(xué)習(xí)。比如WCF附加屬性。我們在這里就為大家介紹一下WCF附加屬性實現(xiàn)單實例的方法。#t#

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比渝北網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式渝北網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋渝北地區(qū)。費用合理售后完善,十多年實體公司更值得信賴。
WCF附加屬性代碼如下:
- class SingletonWindow
- {
- //注冊附加屬性
- public static readonly DependencyProperty
IsEnabledProperty = - DependencyProperty.RegisterAttached
("IsEnabled", typeof(bool), typeof
(SingletonWindow), new Framework
PropertyMetadata(OnIsEnabledChanged)); - public static void SetIsEnabled
(DependencyObject element, Boolean value) - {
- element.SetValue(IsEnabledProperty, value);
- }
- public static Boolean GetIsEnabled
(DependencyObject element) - {
- return (Boolean)element.GetValue
(IsEnabledProperty); - }
- //根據(jù)附加屬性的返回值使能單實例模式
- public static void OnIsEnabledChanged
(DependencyObject obj, Dependency
PropertyChangedEventArgs args) - {
- if ((bool)args.NewValue != true)
- {
- return;
- }
- Process();
- return;
- }
- public static void Process()
//如果不適用附加屬性也可以直接使用此函數(shù) - {
- //判斷單實例的方式有很多,如mutex,process,
文件鎖等,這里用的是process方式 - var process = GetRunningInstance();
- if (process != null)
- {
- HandleRunningInstance(process);
- Environment.Exit(0);
- }
- }
- const int WS_SHOWNORMAL = 1;
- [System.Runtime.InteropServices.
DllImport("User32.dll")] - static extern bool ShowWindowAsync
(IntPtr hWnd, int cmdShow); - [System.Runtime.InteropServices.
DllImport("User32.dll")] - static extern bool SetForeground
Window(IntPtr hWnd); - [System.Runtime.InteropServices.
DllImport("user32.dll")] - static extern bool FlashWindow
(IntPtr hWnd,bool bInvert); - static System.Diagnostics.Process
GetRunningInstance() - {
- var current = System.Diagnostics.
Process.GetCurrentProcess(); - var processes = System.Diagnostics
.Process.GetProcessesByName(current.
ProcessName); - foreach (var process in processes)
- {
- if (process.Id != current.Id)
- if (System.Reflection.Assembly.
GetExecutingAssembly().Location.
Replace("/", "\\") == current.
MainModule.FileName) - return process;
- }
- return null;
- }
- static void HandleRunningInstance
(System.Diagnostics.Process instance) - {
- if (instance.MainWindowHandle!=IntPtr.Zero)
- {
- for (int i = 0; i < 2; i++)
- {
- FlashWindow(instance.MainWindowHandle, 500);
- }
- SetForegroundWindow(instance.
MainWindowHandle); - ShowWindowAsync(instance.
MainWindowHandle, WS_SHOWNORMAL); - }
- else
- {
- //else 處理有點麻煩,簡化如下
- MessageBox.Show("已經(jīng)有一個實例在運行,
無法啟動第二個實例"); - }
- }
- static void FlashWindow(IntPtr hanlde, int interval)
- {
- FlashWindow(hanlde, true);
- System.Threading.Thread.Sleep(interval);
- FlashWindow(hanlde, false);
- System.Threading.Thread.Sleep(interval);
- }
- }
WCF附加屬性代碼其實很簡單,前半部分是注冊依賴屬性,然后根據(jù)依賴屬性判斷是否啟用單實例模式;后半部分就是一個傳統(tǒng)的單實例模式的功能了。也就不介紹了。
使用這段WCF附加屬性代碼也很簡單:
Xaml方式:在主窗口的xaml文件中加入附加屬性即可
- < Window xmlns:src=
"clr-namespace:WpfApplication1"
src:SingletonWindow.IsEnabled="true">
傳統(tǒng)方式:直接使用代碼中后半部分,和winform下沒什么區(qū)別。在主窗口的構(gòu)造函數(shù)里面加入這句話。
SingletonWindow.Process();
文章題目:WCF附加屬性技巧掌握
鏈接分享:http://www.5511xx.com/article/dhsdcch.html


咨詢
建站咨詢
