में विंडोज़ को लटकने का क्या कारण है, हमें एक बड़े और जटिल डेस्कटॉप एप्लिकेशन के साथ कुछ समस्याएं आई हैं, जहां डब्ल्यूपीएफ के लिए माइक्रोसॉफ्ट रिबन का उपयोग (या इससे जुड़े चीजों का संयोजन) कंप्यूटर को कंप्यूटर का कारण बनता है लटका।इस डब्ल्यूपीएफ रिबन एप्लिकेशन
नीचे उबला हुआ नीचे कोड कई कंप्यूटरों पर विंडोज़ लटका स्थिति को ट्रिगर करने लगता है। कुछ कंप्यूटर हर बार इस लटका अनुभव करेंगे, कुछ इसे कभी अनुभव नहीं करेंगे। लटका होगा, कुछ कंप्यूटर पर पूरे सत्र को लॉक कर देगा (num लॉक और कैप्स लॉक समेत), लेकिन दूसरों पर, माउस अभी भी स्थानांतरित होगा (अभी भी व्यवसाय से बाहर संख्या लॉक)। जब कंप्यूटर अनुत्तरदायी हो जाता है, ऐसा लगता है कि रिमोट लॉगऑन और नेटवर्क शेयरिंग जैसी चीजें अभी भी काम करती हैं, लेकिन कंसोल सत्र को समाप्त करना संभव नहीं है।
- माइक्रोसॉफ्ट रिबन WPF
- विंडोज एक ElementHost में आवेदन की मेजबानी WPF नियंत्रण फॉर्म्स के लिए:
- सॉफ्टवेयर के उपयोग WPF रिबन पर प्रतिपादन (CreateParams के उपयोग के द्वारा) डबल बफ़र विण्डोज़ फॉर्म्स के उपयोग
संक्षेप में, जो होने के लिए व्यवहार का मूल कारण कुछ चीजें का संयोजन है लगता है
हमने बाद में कुछ चयनित रूपों पर WS_EX_COMPOSITED
का उपयोग करके इस समस्या को हल किया है, लेकिन मैं इस मुद्दे के मूल कारण को उजागर करना चाहता हूं।
मुझे अभी तक लटकने के लिए एक सीधा आगे बढ़ने का तरीका नहीं मिला है, लेकिन कम से कम कुछ मशीनों पर, कम से कम कुछ मशीनों पर, व्यवसाय को पूरा करने/पुनर्स्थापित करने और माउस के ऊपर माउस को घुमाने के द्वारा व्यवसाय किया जाता है रिबन बटन।
निम्नलिखित कोड x86 .NET 4.0 के रूप में संकलित किया गया है, Microsoft WPF Ribbon .NET 4.0 लाइब्रेरी के विरुद्ध।
using System;
using System.Windows.Forms;
using Microsoft.Windows.Controls.Ribbon;
using System.Windows.Interop;
using System.Windows.Forms.Integration;
namespace WindowsRibbonHang
{
public class Form1 : Form
{
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
public Form1()
{
Ribbon ribbon = new Ribbon();
RibbonTab tab = new RibbonTab { Header = "FooTab" };
ribbon.Items.Add(tab);
RibbonSplitButton button = new RibbonSplitButton { Label = "FooButton" };
tab.Items.Add(button);
ElementHost elementHost = new ElementHost
{
Dock = DockStyle.Fill,
Child = ribbon,
};
Controls.Add(elementHost);
Dock = DockStyle.Fill;
ribbon.Loaded += (sender, args) => {
HwndSource hwndSource = System.Windows.PresentationSource.FromVisual(ribbon) as HwndSource;
HwndTarget hwndTarget = hwndSource.CompositionTarget;
hwndTarget.RenderMode = RenderMode.SoftwareOnly;
};
}
}
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
क्या आपने कभी इस मुद्दे को हल किया है? मुझे केवल यह प्रश्न मिल सकता है और यह अन्य एक http://stackoverflow.com/questions/7719627/wpf-elementhost-in-winforms-crashes-windows-when- इस मुद्दे पर मिश्रित है लेकिन न ही कोई समाधान मिला है। –
@EduardoWada वास्तव में नहीं। जैसा कि @ ओली ने कहा, शायद इसे ग्राफिक्स ड्राइवरों के साथ डब्ल्यूपीएफ इंटरैक्ट करने के तरीके से करना होगा। "समाधान" 'CreateParams' ओवरराइड को अक्षम करना था, और इसके बजाय अधिक लक्षित रूपों पर ऐसा करना था। – torkildr