2009-07-06 8 views
30

में परिभाषित किया गया है, तो जब मैं अलग-अलग प्रोजेक्ट में एक WPF संसाधन परिभाषित करता हूं तो मैं विजुअल स्टूडियो डिजाइनर त्रुटियों से कैसे बच सकता हूं?विजुअल स्टूडियो डिजाइनर त्रुटियों से बचें जब WPF संसाधन को अलग परियोजना

मेरे पास एक समग्र WPF अनुप्रयोग में तीन परियोजनाएं हैं: मुख्य अनुप्रयोग, एक "आधारभूत संरचना" लाइब्रेरी, और एक "मॉड्यूल" लाइब्रेरी। मुख्य अनुप्रयोग अन्य परियोजनाओं को उनके आउटपुट डीएलएल के माध्यम से संदर्भित करता है (परियोजनाएं एक साथ एक समाधान में स्थित नहीं हैं)।

मैं "बुनियादी ढांचे" पुस्तकालय में एक त्वचा (ResourceDictionary में कुछ ब्रश और शैलियों को परिभाषित कर रहा हूं) परिभाषित कर रहा हूं। मैं मुख्य अनुप्रयोग को त्वचा का चयन करने और इसे पूरे एप्लिकेशन में उपलब्ध कराने के लिए चाहता हूं (App12xaml में MergedDictionaries के माध्यम से)।

मेरे मॉड्यूल में मैं मुख्य अनुप्रयोग लोड होने वाली त्वचा में परिभाषित संसाधनों का उपयोग करना चाहता हूं। अगर मैं संसाधन का संदर्भ देता हूं जैसे कि यह स्थानीय रूप से उपलब्ध था:

Background={StaticResource MainBackgroundBrush} 

लगभग सब कुछ वांछित के रूप में काम करता है। अपवाद यह है कि विजुअल स्टूडियो के डिजाइनर उलझन में आते हैं और मुझे बताते हैं कि "स्टेटिक रिसोर्स संदर्भ 'मेनबैकग्राउंड ब्रश' नहीं मिला"। यह प्रभावी रूप से मुझे डिजाइनर का उपयोग करने से रोकता है।

एक परियोजना में "त्वचा" ResourceDictionary को परिभाषित करने के लिए मैं क्या कर सकता हूं, मुख्य अनुप्रयोग में त्वचा का संदर्भ देता है, और उसके बाद मॉड्यूल प्रोजेक्ट में अपने संसाधनों का उपयोग करता है?

+2

हालांकि यह तकनीकी रूप से अपने प्रश्न बिल्कुल उत्तर न मिले, अभिव्यक्ति मिश्रण 2 डबल अविवेक देखने समस्याएं आ रही हैं और बाहर renders बस मेरे अनुभव में इन विशिष्ट मामलों में नहीं मिल रहा है। – scwagner

+0

वीएस -2010 बीटा 1 में आप अभी भी डिज़ाइनर का उपयोग कर सकते हैं यदि उसे संसाधन नहीं मिल रहा है। यह आपको एक चेतावनी देता है और फिर विशेषता को अनदेखा करता है। –

उत्तर

3

StaticResource के बजाय DynamicResource का उपयोग करने का एक संभावित समाधान है। विजुअल स्टूडियो 2008 डिज़ाइनर बिना किसी स्टाइल के नियंत्रण को प्रदर्शित करता है, जैसे VS2010 बीटा 1 करता है जब यह StaticResource को हल नहीं कर सकता है।

DynamicResource का उपयोग ऐसी परिस्थितियों में उपयुक्त है जहां एक विशेष शैली रनटाइम पर बदल सकती है, जैसे स्किनिंग।

मैंने पाया कुछ संबंधित सवाल यह समर्थन:

जब भी एक संसाधन के स्थानीय नहीं है मैं भी कोई है जो कहा गया है कि DynamicResource इस्तेमाल किया जाना चाहिए पाया :

4

आप अपनी खुद की ResourceDictionary वर्ग बना सकते हैं ResourceDictionary से इनहेरिट। फिर आप इसे डिज़ाइन-टाइम पर व्यवस्थित कर सकते हैं यह कस्टम संसाधन डिक्शनरी कुछ स्पष्ट रूप से परिभाषित शैलियों को लोड करता है (यानी रनटाइम पर ऐप से लोड किए गए), जबकि रनटाइम पर यह कुछ भी नहीं करता है। इस के लिए IsInDesignMode-Property का मूल्यांकन किया जा सकता है।

कहें कि आपके पास ऐसी श्रेणी है, जिसे 'DesignTimeResourceDictionary' कहा जाता है, तो आप बस s.th का उपयोग करते हैं।

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <Util:DesignTimeResourceDictionary Source="SomeUriToYourResources"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</UserControl.Resources> 

डिज़ाइन-समय पर अपने संसाधनों को लोड करने और डिजाइनर को काम करने के लिए। रनटाइम पर आप अपने DesignTimeResourceDictionary को संसाधनों की लोडिंग को छोड़कर वांछित व्यवहार प्राप्त कर सकते हैं।

यदि आपको आवश्यकता है, तो आप वास्तव में इसके लिए वास्तविक संसाधनों की एक प्रति बना सकते हैं, या आप डिज़ाइनर को काम करने के लिए आवश्यक सभी कुंजियों वाली एक डमी शब्दकोश बना सकते हैं।

0

मैं सिर्फ साइमन डी उत्तर का विस्तार करना चाहता हूं। वह जो प्रस्ताव दे रहा है वह वह समाधान है जिसका मैं अभी उपयोग कर रहा हूं। मैं बस पूरा स्रोत कोड साझा करना चाहता था। यह Trick To Use A ResourceDictionary Only When In Design Mode स्रोत से है।

public class DesignTimeResourceDictionary : ResourceDictionary 
{ 
    /// <summary> 
    /// Local field storing info about designtime source. 
    /// </summary> 
    private string designTimeSource; 

    /// <summary> 
    /// Gets or sets the design time source. 
    /// </summary> 
    /// <value> 
    /// The design time source. 
    /// </value> 
    public string DesignTimeSource 
    { 
     get 
     { 
      return this.designTimeSource; 
     } 

     set 
     { 
      this.designTimeSource = value; 
      if ((bool)DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue) 
      { 
       base.Source = new Uri(designTimeSource); 
      } 
     } 
    } 

    /// <summary> 
    /// Gets or sets the uniform resource identifier (URI) to load resources from. 
    /// </summary> 
    /// <returns>The source location of an external resource dictionary. </returns> 
    public new Uri Source 
    { 
     get 
     { 
      throw new Exception("Use DesignTimeSource instead Source!"); 
     } 

     set 
     { 
      throw new Exception("Use DesignTimeSource instead Source!"); 
     } 
    } 
} 

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation Jump " 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml Jump " 
    Title="MainWindow" Height="350" Width="525" 
    xmlns:local="clr-namespace:WpfApplication1"> 

    <Window.Resources> 
    <local:DesignTimeResourceDictionary DesignTimeSource="pack://application:,,,/BlueColors.xaml"/> 
    </Window.Resources> 

    <Grid> 
     <Button Background="{DynamicResource defaultBackground}" 
     HorizontalAlignment="Center" VerticalAlignment="Center">click me</Button> 
    </Grid> 
</Window> 
संबंधित मुद्दे