سؤال

ولقد سلوك المرفقة تعرف thusly، ..

    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 (المرجع System.Windows.Interop.MSG جي اس، System.Runtime.InteropServices.HandleRef hWnd عنصر، uMsgFilterMin الباحث، الباحث uMsgFilterMax) + 0x15 بايت
      WindowsBase.dll! System.Windows.Threading.Dispatcher.GetMessage (المرجع System.Windows.Interop.MSG جي اس، System.IntPtr HWND، الباحث minMessage، الباحث 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 #       [الأصلية لإدارتها الانتقالية]
      [تمكنت من الانتقال الأصلية]
      mscorlib.dll! System.AppDomain.nExecuteAssembly (System.Reflection.Assembly التجمع، سلسلة [] وسائط) + 0x19 بايت       mscorlib.dll! System.Runtime.Hosting.ManifestRunner.Run (منطقي checkAptModel) + 0x6e بايت       mscorlib.dll! System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly () + 0x84 بايت       mscorlib.dll! System.Runtime.Hosting.ApplicationActivator.CreateInstance (System.ActivationContext activationContext، سلسلة [] activationCustomData) + 0x65 بايت       mscorlib.dll! System.Runtime.Hosting.ApplicationActivator.CreateInstance (System.ActivationContext activationContext) + 0xa بايت       mscorlib.dll! System.Activator.CreateInstance (System.ActivationContext 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! أيضا، وأنا على دائما الحصول على هذا البيان التصحيح الماضي عندما تفعل ذلك تعليق.

ويمكن لأي شخص أن النقطة لي في الاتجاه السليم؟ هذا واحد يقود لي مجنون!

هل كانت مفيدة؟

المحلول

ولدي تطبيق WPF بسيط جدا يستخدم عنصر التحكم WPF WebBrowser في تطبيق WPF. أنا عندي نفس المشكلة بالضبط. (بدأت مع برنامج Google Earth باستخدام جافا سكريبت) سيطرة WPF WebBrowser تجميد حوالي 75٪ من الوقت عندما كنت تغيير حجم نافذة أفقيا. أحصل على بالضبط نفس تفريغ المكدس كما هو موضح أعلاه. عندما كنت نسخ / تشغيل قابل للتنفيذ على جهاز كمبيوتر مختلف (عن تشغيل XP SP3) تشغيله غرامة وأبدا توقف. أود أيضا أن يكون التطبيق أكثر تعقيدا التي هي متعددة الخيوط التي أيضا توقف مع تفريغ مماثل كومة (في انتظار أيضا على رسالة داخل المكتبة التخييط) على هذا الكمبيوتر PC ولكن ليس آخر. التطبيق للتحكم WPF WebBrowser لديه نفس المشكلة سواء فمن المستهدف لصافي 3.5 أو 4.0. كنت NETfx_Setupverifier للتحقق من المنشآت صافي صحيحة، ولكن ما زلت تشك هناك مشكلة مع أي صافي أو بعض المرافق COM الذي يسبب الصافي - COM إمكانية التشغيل المتداخل ليكون غير مستقر. بل هو أيضا تخميني أن بلدي التطبيق ينتظر على بعض الأحداث غير المدارة / الرسالة التي لم تصل بسبب وجود مشكلة مع إمكانية التشغيل المتداخل. كتبت أيضا نفس التطبيق بسيط باستخدام WinForms عناصر / WinForm التحكم WebBrowser وأن التطبيق لم توقف على نفس الكمبيوتر.

هل لديها أي اقتراحات حول كيفية تعقب السبب؟ أنا أفكر في إلغاء تثبيت تماما / إعادة تثبيت الأطر. NET على الرغم من أنها تم التحقق الصحيح. أنا لا أعرف حتى أين للبحث عن الشذوذ على الجانب COM.

نصائح أخرى

وهنا يذهب بعض الحقائق عشوائية تقريبا والأسئلة، التي قد تساعدك.

وأولا وقبل كل شيء، وأنا لا يمكن أن تتكاثر مشكلتك. مهما حاولت. عملت دائما.

والمكدس أثر أيضا تبدو جيدة بالنسبة لي: أنها تحافظ على معالجة الرسائل حلقة. ما يخلط لك بالضبط؟ تمكنت من التحول الأصلي؟

وأنت لا يمكن أن يكون موضوع واحد في تطبيق WPF. ماذا ترى في المواضيع نافذة في VS المصحح؟

وعندما تصل إلى كسر كل ما أراه الدعوة إلى ofd.ShowDialog () في أثر الرئيسي موضوع المكدس، وعامل واحد موضوع اسمه SystemEvents. NET إقامة في WindowThreadProc ()، والانتظار على كائن متزامنة. ماذا ترى؟

يبدو أنك وصلت الى طريق مسدود بطريقة أو بأخرى.

وحاول محتويات التفاف OpenFileBrowser() إلى try... catch{}. هل هناك أي أخطاء؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top