मैंने कभी भी Office ऐड-इन नहीं बनाया है, लेकिन मैंने अन्य प्रकार के गैर-WPF अनुप्रयोगों (विंडोज फॉर्म, पुस्तकालयों को WPF दृश्यों से उत्पन्न करने के लिए पुस्तकालयों आदि) में WPF विंडो का उपयोग किया है। आप this question. में सुझाए गए दृष्टिकोण को आजमा सकते हैं। यह दिखाता है कि थ्रेड को कॉन्फ़िगर कैसे करें ताकि यह WPF ऐप चला सके। आप एक WPF अनुप्रयोग के उत्पन्न ऐप्लिकेशन के कोड ("App.gics") पर एक नज़र रखना है, तो ऐसा लगता है इसे इस तरह शुरू कर दिया गया है:
/// <summary>
/// Application Entry Point.
/// </summary>
[System.STAThreadAttribute()]
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
public static void Main() {
WpfApplication1.App app = new WpfApplication1.App();
app.InitializeComponent();
app.Run();
}
मैं के साथ एक इकाई परीक्षण से किसी एप्लिकेशन की लॉन्चिंग की कोशिश की निम्नलिखित कोड और यह अच्छी तरह से काम:
[TestMethod]
public void TestMethod()
{
// The dispatcher thread
var t = new Thread(() =>
{
var app = new App();
// Corrects the error "System.IO.IOException: Assembly.GetEntryAssembly() returns null..."
App.ResourceAssembly = app.GetType().Assembly;
app.InitializeComponent();
app.Run();
});
// Configure the thread
t.SetApartmentState(ApartmentState.STA);
t.Start();
t.Join();
}
संपादित
अपने कोड को देखते हुए मुझे विश्वास है कि बयान SynchronizationContext को समझदार विंडो उदाहरण के निर्माण है, नहीं निर्माण आपके व्यूमोडेल का (जब तक आपका व्यूमोडेल व्यू तर्क से संबंधित नहीं होता है और नियंत्रण को तत्काल करता है, ऐसा कुछ नहीं करना चाहिए)। तो आप ऐप के थ्रेड पर विंडो के त्वरण को स्थानांतरित करने का प्रयास कर सकते हैं। कुछ इस तरह:
[TestMethod]
public void TestMethod3()
{
// Creates the viewmodel with the necessary infomation wherever
// you need to.
MyViewModel viewModel = new MyViewModel(string infoFromOffice);
// The dispatcher thread
var t = new Thread(() =>
{
var app = new App();
// Corrects the error "System.IO.IOException: Assembly.GetEntryAssembly() returns null..."
App.ResourceAssembly = app.GetType().Assembly;
app.InitializeComponent();
// Creates the Window in the App's Thread and pass the information to it
MyWindow view = new MyWindow();
view.DataContext = viewModel;
app.Run(view);
});
// Configure the thread
t.SetApartmentState(ApartmentState.STA);
t.Start();
t.Join();
}
स्रोत
2012-11-16 18:04:59
, यह 'wpfApp कॉल करने के लिए किसी भी फर्क पड़ता है।चलाएं (नया MyWindow {DataContext = नया MyViewModel (infoFromOffice)}); ' – Jay
सुझाव के लिए धन्यवाद, दुर्भाग्य से यह काम नहीं करता है। – Coder1095