J'ai un comportement attaché défini thusly, ..WPF - Aléatoire accroché avec le navigateur de fichiers de comportement attaché
public static class FileBrowserBehaviour
{
public static bool GetBrowsesOnClick(DependencyObject obj)
{
return (bool)obj.GetValue(BrowsesOnClickProperty);
}
public static void SetBrowsesOnClick(DependencyObject obj, bool value)
{
obj.SetValue(BrowsesOnClickProperty, value);
}
// Using a DependencyProperty as the backing store for BrowsesOnClick. This enables animation, styling, binding, etc...
public static readonly DependencyProperty BrowsesOnClickProperty =
DependencyProperty.RegisterAttached("BrowsesOnClick", typeof(bool), typeof(FileBrowserBehaviour), new FrameworkPropertyMetadata(false, new PropertyChangedCallback(BrowsesOnClickChanged)));
public static void BrowsesOnClickChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
FrameworkElement fe = obj as FrameworkElement;
if ((bool)args.NewValue)
{
fe.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(OpenFileBrowser);
}
else
{
fe.PreviewMouseLeftButtonDown -= new MouseButtonEventHandler(OpenFileBrowser);
}
}
static void OpenFileBrowser(object sender, MouseButtonEventArgs e)
{
var tb = sender as TextBox;
if (tb.Text.Length < 1 || tb.Text=="Click to browse..")
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Executables | *.exe";
if (ofd.ShowDialog() == true)
{
Debug.WriteLine("Setting textbox text-" + ofd.FileName);
tb.Text = ofd.FileName;
Debug.WriteLine("Set textbox text");
}
}
}
}
C'est un comportement attaché de simple et agréable qui ouvre automatiquement un OpenFileDialog lorsque vous cliquez sur une zone de texte et met le nom de fichier dans la boîte lorsque vous avez terminé.
Cela fonctionne peut-être 40% du temps, mais le reste du temps l'application entière se bloque. La pile d'appel à ce point ressemble à ceci -
[Managed to Native Transition]
WindowsBase.dll MS.Win32.UnsafeNativeMethods.GetMessageW (ref System.Windows.Interop.MSG msg, System.Runtime.InteropServices.HandleRef hWnd, int uMsgFilterMin, int uMsgFilterMax) + 0x15 octets
WindowsBase.dll! System.Windows.Threading.Dispatcher.GetMessage (réf System.Windows.Interop.MSG msg, System.IntPtr hwnd, int minMessage, int maxMessage) + 0x48 octets WindowsBase.dll! System.Windows.Threading.Dispatcher.PushFrameImpl (System.Windows.Threading.DispatcherFrame frame = {System.Windows.Threading.DispatcherFrame}) + 0x8b octets WindowsBase.dll! System.Windows .Threading.Dispatcher.PushFrame (cadre System.Windows.Threading.DispatcherFrame) + 0x49 octets
WindowsBase.dll! System.Windows.Threading.Dispatcher.Run() + 0x4c octets
PresentationFramework.dll! System.Windows.Application .RunDispatcher (objet ignoré) + 0x1e octets
PresentationFramework.dll! System.Windows.Application.RunInternal (fenêtre System.Windows.Window) + 0x6f octets PresentationFramework.dll! System.Windows.Application.Run (System.Windows. fenêtre de fenêtre) + 0x26 octets PresentationFramework.dll! System.Windows.Application.Run() + 0x19 octets Debugatron.exe! Debugatron.App.Main() + 0x5E octets C# [native transition Managed]
[Managed to Native Transition]
mscorlib.dll! System.AppDomain.nExecuteAssembly (Assemblage System.Reflection.Assembly, chaîne [] args) + 0x19 octets mscorlib.dll! System.Runtime.Hosting.ManifestRunner.Run (booléen) checkAptModel) + 0x6e octets mscorlib.dll! System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly() + 0x84 octets mscorlib.dll! System.Runtime.Hosting.ApplicationActivator.CreateInstance (System.ActivationContext activationContext, chaîne [] activationCustomData) + 0x65 octets mscorlib.dll! System.Runtime.Hosting.ApplicationActivator.CreateInstance (System.ActivationContext ActivationContext) + 0xa octets mscorlib.dll! System.Activator.CreateInstance (System.ActivationContext ActivationContext) + 0x3E octets
Mic rosoft.VisualStudio.HostingProcess.Utilities.dll! Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() + 0x23 octets
MSCorLib.dll! System.Threading.ThreadHelper.ThreadStart_Context (état d'objet) + 0x66 octets
MSCorLib.dll! System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext ExecutionContext, rappel System.Threading.ContextCallback, état de l'objet) + 0x6f octets
mscorlib.dll! System.Threading.ThreadHelper.ThreadStart() + 0x44 octets
Maintenant, j'ai vu ce genre de chose avant de faire des choses asynchrones mais il n'y a rien de cela à ce stade. Le seul thread vivant est le fil de l'interface utilisateur! En outre, je toujours obtenir cette dernière instruction de débogage lorsqu'il se bloque.
Quelqu'un peut-il me diriger dans la bonne direction? Celui-ci me rend fou!
Je ne vais pas complètement fou alors?!?! – Stimul8d
J'ai essayé à la fois l'application WPF WebBroserCtrl très simple et la 2ème application avec un fil de fond sur plusieurs systèmes (tous XP SP3). Sur 3 systèmes monoprocesseur/noyau, ils fonctionnent toujours et ne se bloquent jamais. Sur 2 systèmes de CPU multi-core/hyperthreaded les deux programmes se trouvent exactement au même endroit mentionné ci-dessus. Je m'attends à ce que le WPF WebBrowserCtrl simple soit multithread dans le code .net, ce qui en fait un problème de threading dans les deux cas. Est-il possible qu'il existe un problème de thread. NET avec les processeurs multi-core? – chetto
J'ai également inversé les deux programmes de .Net 4.0 à .Net 3.5 au cas où il y aurait un problème avec .Net 4.0 sous XP (La configuration XP minimale supportée par .Net 4.0 est XP SP3.), Mais cela ne semble pas avoir fait de différence. – chetto