このように定義された添付の動作があります..
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");
}
}
}
}
これは、テキスト ボックスをクリックすると OpenFileDialog が開き、完了したらファイル名をボックスに入力する、単純な添付ビヘイビアです。
おそらく 40% の時間は機能しますが、残りの時間はアプリ全体がハングします。この時点でのコール スタックは次のようになります。
[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 バイト
WindowsBase.dll!System.Windows.Threading. Dispatcher.GetMessage(ref System.Windows.Interop.MSG msg, System.IntPtr hwnd, int minMessage, int maxMessage) + 0x48 バイト WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame フレーム= {System.Windows.Threading.DispatcherFrame}) + 0x8b バイト WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame フレーム) + 0x49 バイト
WindowsBase.dll!System.Windows.Threading. Dispatcher.Run() + 0x4c バイト
PresentationFramework.dll!System.Windows.Application.RunDispatcher (オブジェクト無視) + 0x1e バイト
PresentationFramework.dll!System.Windows.Application.RunInternal(System.Windows.Window ウィンドウ) + 0x6f バイト PresentationFramework.dll!System.Windows.Application. Run(System.Windows.Window ウィンドウ) + 0x26 バイト PresentationFramework.dll!System.Windows.Application.Run() + 0x19 バイト Debugatron.exe!Debugatron.App.Main() + 0x5e バイト C# [Managed Transition にネイティブ]
[管理からネイティブへの移行]
mscorlib.dll!System.AppDomain.nExecuteAssembly(System.Reflection.Assembly アセンブリ、string[] args) + 0x19 バイト mscorlib.dll!System.Runtime.Hosting.ManifestRunner.Run(bool checkAptModel) + 0x6e バイト mscorlib.dll!System .Runtime.Hosting.ManifestRunner.ExecuteAsAssembly() + 0x84 バイト mscorlib.dll!System.Runtime.Hosting.ApplicationActivator.CreateInstance(System.ActivationContext activationContext, string[] activationCustomData) + 0x65 バイト mscorlib.dll!System.Runtime.Hosting. ApplicationActivator.CreateInstance(System.ActivationContext アクティベーションコンテキスト) + 0xa バイト mscorlib.dll!System.Activator.CreateInstance(System.ActivationContext アクティベーションコンテキスト) + 0x3e バイト
Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() + 0x23 バイト
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(オブジェクトの状態) + 0x66 バイト
mscorlib.dll!System.Threading. ExecutionContext.Run(System.Threading.ExecutionContext executionContext、System.Threading.ContextCallback コールバック、オブジェクトの状態) + 0x6f バイト
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x44 バイト
さて、非同期処理を行っているときにこの種のことを見たことがありますが、その時点では何も起こっていません。生きているスレッドは UI スレッドだけです。また、ハングしたときは常に最後のデバッグステートメントを取得します。
誰かが私を正しい方向に向けることができますか? これは私を狂わせる !