SEBWIN-106: Implemented basic favicon handling.
This commit is contained in:
		
							parent
							
								
									6c3a7bee5c
								
							
						
					
					
						commit
						0ee13c9c8b
					
				
					 13 changed files with 152 additions and 11 deletions
				
			
		|  | @ -39,6 +39,7 @@ namespace SafeExamBrowser.Browser | ||||||
| 		public IWindow Window { get { return window; } } | 		public IWindow Window { get { return window; } } | ||||||
| 
 | 
 | ||||||
| 		public event DownloadRequestedEventHandler ConfigurationDownloadRequested; | 		public event DownloadRequestedEventHandler ConfigurationDownloadRequested; | ||||||
|  | 		public event IconChangedEventHandler IconChanged; | ||||||
| 		public event InstanceTerminatedEventHandler Terminated; | 		public event InstanceTerminatedEventHandler Terminated; | ||||||
| 		public event NameChangedEventHandler NameChanged; | 		public event NameChangedEventHandler NameChanged; | ||||||
| 		public event PopupRequestedEventHandler PopupRequested; | 		public event PopupRequestedEventHandler PopupRequested; | ||||||
|  | @ -66,17 +67,19 @@ namespace SafeExamBrowser.Browser | ||||||
| 		internal void Initialize() | 		internal void Initialize() | ||||||
| 		{ | 		{ | ||||||
| 			var contextMenuHandler = new ContextMenuHandler(settings, text); | 			var contextMenuHandler = new ContextMenuHandler(settings, text); | ||||||
|  | 			var displayHandler = new DisplayHandler(); | ||||||
| 			var downloadLogger = logger.CloneFor($"{nameof(DownloadHandler)} {Id}"); | 			var downloadLogger = logger.CloneFor($"{nameof(DownloadHandler)} {Id}"); | ||||||
| 			var downloadHandler = new DownloadHandler(appConfig, settings, downloadLogger); | 			var downloadHandler = new DownloadHandler(appConfig, settings, downloadLogger); | ||||||
| 			var keyboardHandler = new KeyboardHandler(); | 			var keyboardHandler = new KeyboardHandler(); | ||||||
| 			var lifeSpanHandler = new LifeSpanHandler(); | 			var lifeSpanHandler = new LifeSpanHandler(); | ||||||
| 			var requestHandler = new RequestHandler(appConfig); | 			var requestHandler = new RequestHandler(appConfig); | ||||||
| 
 | 
 | ||||||
|  | 			displayHandler.FaviconChanged += DisplayHandler_FaviconChanged; | ||||||
| 			downloadHandler.ConfigurationDownloadRequested += DownloadHandler_ConfigurationDownloadRequested; | 			downloadHandler.ConfigurationDownloadRequested += DownloadHandler_ConfigurationDownloadRequested; | ||||||
| 			keyboardHandler.ReloadRequested += KeyboardHandler_ReloadRequested; | 			keyboardHandler.ReloadRequested += KeyboardHandler_ReloadRequested; | ||||||
| 			lifeSpanHandler.PopupRequested += LifeSpanHandler_PopupRequested; | 			lifeSpanHandler.PopupRequested += LifeSpanHandler_PopupRequested; | ||||||
| 
 | 
 | ||||||
| 			control = new BrowserControl(contextMenuHandler, downloadHandler, keyboardHandler, lifeSpanHandler, requestHandler, settings.StartUrl); | 			control = new BrowserControl(contextMenuHandler, displayHandler, downloadHandler, keyboardHandler, lifeSpanHandler, requestHandler, settings.StartUrl); | ||||||
| 			control.AddressChanged += Control_AddressChanged; | 			control.AddressChanged += Control_AddressChanged; | ||||||
| 			control.LoadingStateChanged += Control_LoadingStateChanged; | 			control.LoadingStateChanged += Control_LoadingStateChanged; | ||||||
| 			control.TitleChanged += Control_TitleChanged; | 			control.TitleChanged += Control_TitleChanged; | ||||||
|  | @ -139,6 +142,14 @@ namespace SafeExamBrowser.Browser | ||||||
| 			NameChanged?.Invoke(title); | 			NameChanged?.Invoke(title); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		private void DisplayHandler_FaviconChanged(string uri) | ||||||
|  | 		{ | ||||||
|  | 			var icon = new BrowserIconResource(uri); | ||||||
|  | 
 | ||||||
|  | 			IconChanged?.Invoke(icon); | ||||||
|  | 			window.UpdateIcon(icon); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		private void DownloadHandler_ConfigurationDownloadRequested(string fileName, DownloadEventArgs args) | 		private void DownloadHandler_ConfigurationDownloadRequested(string fileName, DownloadEventArgs args) | ||||||
| 		{ | 		{ | ||||||
| 			if (settings.AllowConfigurationDownloads) | 			if (settings.AllowConfigurationDownloads) | ||||||
|  |  | ||||||
|  | @ -16,6 +16,7 @@ namespace SafeExamBrowser.Browser | ||||||
| 	internal class BrowserControl : ChromiumWebBrowser, IBrowserControl | 	internal class BrowserControl : ChromiumWebBrowser, IBrowserControl | ||||||
| 	{ | 	{ | ||||||
| 		private IContextMenuHandler contextMenuHandler; | 		private IContextMenuHandler contextMenuHandler; | ||||||
|  | 		private IDisplayHandler displayHandler; | ||||||
| 		private IDownloadHandler downloadHandler; | 		private IDownloadHandler downloadHandler; | ||||||
| 		private IKeyboardHandler keyboardHandler; | 		private IKeyboardHandler keyboardHandler; | ||||||
| 		private ILifeSpanHandler lifeSpanHandler; | 		private ILifeSpanHandler lifeSpanHandler; | ||||||
|  | @ -45,6 +46,7 @@ namespace SafeExamBrowser.Browser | ||||||
| 
 | 
 | ||||||
| 		public BrowserControl( | 		public BrowserControl( | ||||||
| 			IContextMenuHandler contextMenuHandler, | 			IContextMenuHandler contextMenuHandler, | ||||||
|  | 			IDisplayHandler displayHandler, | ||||||
| 			IDownloadHandler downloadHandler, | 			IDownloadHandler downloadHandler, | ||||||
| 			IKeyboardHandler keyboardHandler, | 			IKeyboardHandler keyboardHandler, | ||||||
| 			ILifeSpanHandler lifeSpanHandler, | 			ILifeSpanHandler lifeSpanHandler, | ||||||
|  | @ -52,6 +54,7 @@ namespace SafeExamBrowser.Browser | ||||||
| 			string url) : base(url) | 			string url) : base(url) | ||||||
| 		{ | 		{ | ||||||
| 			this.contextMenuHandler = contextMenuHandler; | 			this.contextMenuHandler = contextMenuHandler; | ||||||
|  | 			this.displayHandler = displayHandler; | ||||||
| 			this.downloadHandler = downloadHandler; | 			this.downloadHandler = downloadHandler; | ||||||
| 			this.keyboardHandler = keyboardHandler; | 			this.keyboardHandler = keyboardHandler; | ||||||
| 			this.lifeSpanHandler = lifeSpanHandler; | 			this.lifeSpanHandler = lifeSpanHandler; | ||||||
|  | @ -64,6 +67,7 @@ namespace SafeExamBrowser.Browser | ||||||
| 			LoadingStateChanged += (o, args) => loadingStateChanged?.Invoke(args.IsLoading); | 			LoadingStateChanged += (o, args) => loadingStateChanged?.Invoke(args.IsLoading); | ||||||
| 			TitleChanged += (o, args) => titleChanged?.Invoke(args.Title); | 			TitleChanged += (o, args) => titleChanged?.Invoke(args.Title); | ||||||
| 
 | 
 | ||||||
|  | 			DisplayHandler = displayHandler; | ||||||
| 			DownloadHandler = downloadHandler; | 			DownloadHandler = downloadHandler; | ||||||
| 			KeyboardHandler = keyboardHandler; | 			KeyboardHandler = keyboardHandler; | ||||||
| 			LifeSpanHandler = lifeSpanHandler; | 			LifeSpanHandler = lifeSpanHandler; | ||||||
|  |  | ||||||
|  | @ -13,8 +13,13 @@ namespace SafeExamBrowser.Browser | ||||||
| { | { | ||||||
| 	public class BrowserIconResource : IIconResource | 	public class BrowserIconResource : IIconResource | ||||||
| 	{ | 	{ | ||||||
| 		public Uri Uri => new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/SafeExamBrowser.ico"); | 		public Uri Uri { get; private set; } | ||||||
| 		public bool IsBitmapResource => true; | 		public bool IsBitmapResource => true; | ||||||
| 		public bool IsXamlResource => false; | 		public bool IsXamlResource => false; | ||||||
|  | 
 | ||||||
|  | 		public BrowserIconResource(string uri = null) | ||||||
|  | 		{ | ||||||
|  | 			Uri = new Uri(uri ?? "pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/SafeExamBrowser.ico"); | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										12
									
								
								SafeExamBrowser.Browser/Events/FaviconChangedEventHandler.cs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								SafeExamBrowser.Browser/Events/FaviconChangedEventHandler.cs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,12 @@ | ||||||
|  | /* | ||||||
|  |  * Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET) | ||||||
|  |  *  | ||||||
|  |  * This Source Code Form is subject to the terms of the Mozilla Public | ||||||
|  |  * License, v. 2.0. If a copy of the MPL was not distributed with this | ||||||
|  |  * file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | namespace SafeExamBrowser.Browser.Events | ||||||
|  | { | ||||||
|  | 	internal delegate void FaviconChangedEventHandler(string uri); | ||||||
|  | } | ||||||
							
								
								
									
										63
									
								
								SafeExamBrowser.Browser/Handlers/DisplayHandler.cs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								SafeExamBrowser.Browser/Handlers/DisplayHandler.cs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,63 @@ | ||||||
|  | /* | ||||||
|  |  * Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET) | ||||||
|  |  *  | ||||||
|  |  * This Source Code Form is subject to the terms of the Mozilla Public | ||||||
|  |  * License, v. 2.0. If a copy of the MPL was not distributed with this | ||||||
|  |  * file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Linq; | ||||||
|  | using CefSharp; | ||||||
|  | using CefSharp.Structs; | ||||||
|  | using SafeExamBrowser.Browser.Events; | ||||||
|  | 
 | ||||||
|  | namespace SafeExamBrowser.Browser.Handlers | ||||||
|  | { | ||||||
|  | 	/// <remarks> | ||||||
|  | 	/// See https://cefsharp.github.io/api/67.0.0/html/T_CefSharp_IDisplayHandler.htm. | ||||||
|  | 	/// </remarks> | ||||||
|  | 	internal class DisplayHandler : IDisplayHandler | ||||||
|  | 	{ | ||||||
|  | 		public event FaviconChangedEventHandler FaviconChanged; | ||||||
|  | 
 | ||||||
|  | 		public void OnAddressChanged(IWebBrowser chromiumWebBrowser, AddressChangedEventArgs addressChangedArgs) | ||||||
|  | 		{ | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public bool OnAutoResize(IWebBrowser chromiumWebBrowser, IBrowser browser, Size newSize) | ||||||
|  | 		{ | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public bool OnConsoleMessage(IWebBrowser chromiumWebBrowser, ConsoleMessageEventArgs consoleMessageArgs) | ||||||
|  | 		{ | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public void OnFaviconUrlChange(IWebBrowser chromiumWebBrowser, IBrowser browser, IList<string> urls) | ||||||
|  | 		{ | ||||||
|  | 			if (urls.Any()) | ||||||
|  | 			{ | ||||||
|  | 				FaviconChanged?.Invoke(urls.First()); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public void OnFullscreenModeChange(IWebBrowser chromiumWebBrowser, IBrowser browser, bool fullscreen) | ||||||
|  | 		{ | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public void OnStatusMessage(IWebBrowser chromiumWebBrowser, StatusMessageEventArgs statusMessageArgs) | ||||||
|  | 		{ | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public void OnTitleChanged(IWebBrowser chromiumWebBrowser, TitleChangedEventArgs titleChangedArgs) | ||||||
|  | 		{ | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public bool OnTooltipChanged(IWebBrowser chromiumWebBrowser, ref string text) | ||||||
|  | 		{ | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -66,6 +66,7 @@ | ||||||
|     <Compile Include="BrowserApplicationInfo.cs" /> |     <Compile Include="BrowserApplicationInfo.cs" /> | ||||||
|     <Compile Include="BrowserApplicationInstance.cs" /> |     <Compile Include="BrowserApplicationInstance.cs" /> | ||||||
|     <Compile Include="BrowserInstanceIdentifier.cs" /> |     <Compile Include="BrowserInstanceIdentifier.cs" /> | ||||||
|  |     <Compile Include="Events\FaviconChangedEventHandler.cs" /> | ||||||
|     <Compile Include="Events\PopupRequestedEventArgs.cs" /> |     <Compile Include="Events\PopupRequestedEventArgs.cs" /> | ||||||
|     <Compile Include="Events\PopupRequestedEventHandler.cs" /> |     <Compile Include="Events\PopupRequestedEventHandler.cs" /> | ||||||
|     <Compile Include="Events\ReloadRequestedEventHandler.cs" /> |     <Compile Include="Events\ReloadRequestedEventHandler.cs" /> | ||||||
|  | @ -74,6 +75,7 @@ | ||||||
|       <SubType>Component</SubType> |       <SubType>Component</SubType> | ||||||
|     </Compile> |     </Compile> | ||||||
|     <Compile Include="BrowserIconResource.cs" /> |     <Compile Include="BrowserIconResource.cs" /> | ||||||
|  |     <Compile Include="Handlers\DisplayHandler.cs" /> | ||||||
|     <Compile Include="Handlers\DownloadHandler.cs" /> |     <Compile Include="Handlers\DownloadHandler.cs" /> | ||||||
|     <Compile Include="Handlers\KeyboardHandler.cs" /> |     <Compile Include="Handlers\KeyboardHandler.cs" /> | ||||||
|     <Compile Include="Handlers\LifeSpanHandler.cs" /> |     <Compile Include="Handlers\LifeSpanHandler.cs" /> | ||||||
|  |  | ||||||
|  | @ -0,0 +1,17 @@ | ||||||
|  | /* | ||||||
|  |  * Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET) | ||||||
|  |  *  | ||||||
|  |  * This Source Code Form is subject to the terms of the Mozilla Public | ||||||
|  |  * License, v. 2.0. If a copy of the MPL was not distributed with this | ||||||
|  |  * file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | using SafeExamBrowser.Contracts.Configuration; | ||||||
|  | 
 | ||||||
|  | namespace SafeExamBrowser.Contracts.Core.Events | ||||||
|  | { | ||||||
|  | 	/// <summary> | ||||||
|  | 	/// Event handler used to indicate that the icon of an <see cref="IApplicationInstance"/> has changed. | ||||||
|  | 	/// </summary> | ||||||
|  | 	public delegate void IconChangedEventHandler(IIconResource icon); | ||||||
|  | } | ||||||
|  | @ -6,7 +6,6 @@ | ||||||
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. |  * file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| namespace SafeExamBrowser.Contracts.Core.Events | namespace SafeExamBrowser.Contracts.Core.Events | ||||||
| { | { | ||||||
| 	/// <summary> | 	/// <summary> | ||||||
|  |  | ||||||
|  | @ -26,6 +26,11 @@ namespace SafeExamBrowser.Contracts.Core | ||||||
| 		/// </summary> | 		/// </summary> | ||||||
| 		string Name { get; } | 		string Name { get; } | ||||||
| 
 | 
 | ||||||
|  | 		/// <summary> | ||||||
|  | 		/// Event fired when the icon of the application instance has changed. | ||||||
|  | 		/// </summary> | ||||||
|  | 		event IconChangedEventHandler IconChanged; | ||||||
|  | 
 | ||||||
| 		/// <summary> | 		/// <summary> | ||||||
| 		/// Event fired when the application instance has been terminated. | 		/// Event fired when the application instance has been terminated. | ||||||
| 		/// </summary> | 		/// </summary> | ||||||
|  |  | ||||||
|  | @ -71,6 +71,7 @@ | ||||||
|     <Compile Include="Configuration\DataResources\IResourceSaver.cs" /> |     <Compile Include="Configuration\DataResources\IResourceSaver.cs" /> | ||||||
|     <Compile Include="Configuration\SaveStatus.cs" /> |     <Compile Include="Configuration\SaveStatus.cs" /> | ||||||
|     <Compile Include="Configuration\Settings\UserInterfaceMode.cs" /> |     <Compile Include="Configuration\Settings\UserInterfaceMode.cs" /> | ||||||
|  |     <Compile Include="Core\Events\IconChangedEventHandler.cs" /> | ||||||
|     <Compile Include="Core\Events\InstanceTerminatedEventHandler.cs" /> |     <Compile Include="Core\Events\InstanceTerminatedEventHandler.cs" /> | ||||||
|     <Compile Include="Core\Events\NameChangedEventHandler.cs" /> |     <Compile Include="Core\Events\NameChangedEventHandler.cs" /> | ||||||
|     <Compile Include="Core\IApplicationController.cs" /> |     <Compile Include="Core\IApplicationController.cs" /> | ||||||
|  |  | ||||||
|  | @ -6,6 +6,7 @@ | ||||||
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. |  * file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
|  | using SafeExamBrowser.Contracts.Configuration; | ||||||
| using SafeExamBrowser.Contracts.UserInterface.Browser.Events; | using SafeExamBrowser.Contracts.UserInterface.Browser.Events; | ||||||
| using SafeExamBrowser.Contracts.UserInterface.Windows; | using SafeExamBrowser.Contracts.UserInterface.Windows; | ||||||
| 
 | 
 | ||||||
|  | @ -46,6 +47,11 @@ namespace SafeExamBrowser.Contracts.UserInterface.Browser | ||||||
| 		/// </summary> | 		/// </summary> | ||||||
| 		void UpdateAddress(string adress); | 		void UpdateAddress(string adress); | ||||||
| 
 | 
 | ||||||
|  | 		/// <summary> | ||||||
|  | 		/// Updates the icon of the browser window. | ||||||
|  | 		/// </summary> | ||||||
|  | 		void UpdateIcon(IIconResource icon); | ||||||
|  | 
 | ||||||
| 		/// <summary> | 		/// <summary> | ||||||
| 		/// Updates the loading state according to the given value. | 		/// Updates the loading state according to the given value. | ||||||
| 		/// </summary> | 		/// </summary> | ||||||
|  |  | ||||||
|  | @ -9,6 +9,8 @@ | ||||||
| using System; | using System; | ||||||
| using System.Windows; | using System.Windows; | ||||||
| using System.Windows.Input; | using System.Windows.Input; | ||||||
|  | using System.Windows.Media.Imaging; | ||||||
|  | using SafeExamBrowser.Contracts.Configuration; | ||||||
| using SafeExamBrowser.Contracts.Configuration.Settings; | using SafeExamBrowser.Contracts.Configuration.Settings; | ||||||
| using SafeExamBrowser.Contracts.UserInterface.Browser; | using SafeExamBrowser.Contracts.UserInterface.Browser; | ||||||
| using SafeExamBrowser.Contracts.UserInterface.Browser.Events; | using SafeExamBrowser.Contracts.UserInterface.Browser.Events; | ||||||
|  | @ -89,6 +91,11 @@ namespace SafeExamBrowser.UserInterface.Desktop | ||||||
| 			Dispatcher.Invoke(() => UrlTextBox.Text = url); | 			Dispatcher.Invoke(() => UrlTextBox.Text = url); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		public void UpdateIcon(IIconResource icon) | ||||||
|  | 		{ | ||||||
|  | 			Dispatcher.BeginInvoke(new Action(() => Icon = new BitmapImage(icon.Uri))); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		public void UpdateLoadingState(bool isLoading) | 		public void UpdateLoadingState(bool isLoading) | ||||||
| 		{ | 		{ | ||||||
| 			Dispatcher.Invoke(() => | 			Dispatcher.Invoke(() => | ||||||
|  |  | ||||||
|  | @ -6,10 +6,11 @@ | ||||||
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. |  * file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
|  | using System; | ||||||
| using System.Windows; | using System.Windows; | ||||||
| using System.Windows.Controls; | using System.Windows.Controls; | ||||||
| using SafeExamBrowser.Contracts.Core; |  | ||||||
| using SafeExamBrowser.Contracts.Configuration; | using SafeExamBrowser.Contracts.Configuration; | ||||||
|  | using SafeExamBrowser.Contracts.Core; | ||||||
| using SafeExamBrowser.Contracts.UserInterface.Taskbar.Events; | using SafeExamBrowser.Contracts.UserInterface.Taskbar.Events; | ||||||
| using SafeExamBrowser.UserInterface.Desktop.Utilities; | using SafeExamBrowser.UserInterface.Desktop.Utilities; | ||||||
| 
 | 
 | ||||||
|  | @ -37,14 +38,22 @@ namespace SafeExamBrowser.UserInterface.Desktop.Controls | ||||||
| 			Text.Text = instance.Name; | 			Text.Text = instance.Name; | ||||||
| 			Button.ToolTip = instance.Name; | 			Button.ToolTip = instance.Name; | ||||||
| 
 | 
 | ||||||
| 			instance.NameChanged += (name) => | 			instance.IconChanged += Instance_IconChanged; | ||||||
|  | 			instance.NameChanged += Instance_NameChanged; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		private void Instance_IconChanged(IIconResource icon) | ||||||
|  | 		{ | ||||||
|  | 			Dispatcher.BeginInvoke(new Action(() => Icon.Content = IconResourceLoader.Load(icon))); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		private void Instance_NameChanged(string name) | ||||||
| 		{ | 		{ | ||||||
| 			Dispatcher.Invoke(() => | 			Dispatcher.Invoke(() => | ||||||
| 			{ | 			{ | ||||||
| 				Text.Text = name; | 				Text.Text = name; | ||||||
| 				Button.ToolTip = name; | 				Button.ToolTip = name; | ||||||
| 			}); | 			}); | ||||||
| 			}; |  | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		private void Button_Click(object sender, RoutedEventArgs e) | 		private void Button_Click(object sender, RoutedEventArgs e) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 dbuechel
						dbuechel