2013-07-18 14 views
6

इस परिदृश्य की जाँच करें (दूसरों के रूप में अच्छी तरह से लागू हो सकता है) [आप परियोजना सिर्फ सही फ़ाइल पर कोड को पेस्ट कॉपी यहाँ बना सकते हैं]:विजुअल स्टूडियो डब्ल्यूपीएफ डिजाइनर में बग?

एक - मूल सामान (Resources.xaml) के साथ एक ResourceDictionary बनाएँ:

-
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <SolidColorBrush Color="Red" x:Key="Test" /> 

    <Style TargetType="{x:Type GroupBox}" x:Key="Test2" > 
     <Setter Property="Background" Value="Blue" /> 
    </Style> 

    <Style TargetType="{x:Type TextBlock}" > 
     <Setter Property="Foreground" Value="Green" /> 
    </Style> 
</ResourceDictionary> 

ख एक उपयोगकर्ता नियंत्रण आधार जहाँ दूसरों बुनियादी संसाधनों (UserControlBase.cs) युक्त प्राप्त कर लेंगे बनाएँ:

using System.Windows.Controls; 
using System; 
using System.Windows; 

namespace ResourceTest 
{ 
    public class UserControlBase : UserControl 
    { 
     public UserControlBase() 
     { 
      this.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("ResourceTest;component/Resources.xaml", UriKind.RelativeOrAbsolute) }); 
     } 
    } 
} 

ग - एक UserControl आधार से इनहेरिट (UserControl1.xaml) बनाएँ:

<ResourceTest:UserControlBase x:Class="ResourceTest.UserControl1" 

      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:ResourceTest="clr-namespace:ResourceTest" 

      mc:Ignorable="d" 

      d:DesignHeight="300" 
      d:DesignWidth="300" > 
    <Grid> 
     <GroupBox BorderBrush="{StaticResource Test}" Margin="3" Header="Test" Style="{DynamicResource Test2}" > 
      <TextBlock Text="TESTTEST" /> 
     </GroupBox> 

    </Grid> 
</ResourceTest:UserControlBase> 

परिणाम: StaticResources का समाधान नहीं कर रहे हैं (और टेस्ट BorderBrush लोड नहीं है)। डायनेमिक स्रोतों का समाधान किया जाता है (पृष्ठभूमि नीली है) लेकिन डिजाइनर कहता है कि यह संसाधन को वैसे भी नहीं ढूंढ सकता है (पहली बार ठीक काम करता है लेकिन जब आप डिज़ाइनर को खोलते/बंद करते हैं तो संसाधन को हल नहीं किया जा सकता है)। टेक्स्टब्लॉक शैली जैसे गैर नामित संसाधन ठीक काम करते हैं।

क्या यह एक डिज़ाइनर बग है या क्या मैं कुछ गलत कर रहा हूं? संसाधनों को एक परिदृश्य में गतिशील घोषित करना ठीक है जहां संसाधन कभी नहीं बदलेगा?

enter image description here

अग्रिम धन्यवाद।

+0

संसाधनों को गतिशील, बस उतना ही कुशल नहीं घोषित करना ठीक है। यदि आप केवल इस संसाधन डिक्शनरी का उपयोग कर रहे हैं, तो क्या आपने बेस क्लास के लिए एक्सएएमएल फ्रंट में 'UserControl.Resources' में इसे जोड़ने का प्रयास किया है, यह देखने के लिए कि क्या यह अलग-अलग व्यवहार करता है? –

+0

@WillEddins: मेरे असली एप्लिकेशन में संसाधन बेस उपयोगकर्ता नियंत्रण पर सेट होते हैं, इसलिए प्रत्येक नियंत्रण में डब्ल्यूपीएफ डिजाइनर पर इसे देखने के लिए आवश्यक संसाधन होते हैं (अन्यथा शैलियों को केवल रनटाइम पर लागू किया जाता है और हम उचित यूआई डिज़ाइन नहीं कर सकते हैं जब तक कि शुरू नहीं हो जाता प्रत्येक परिवर्तन पर ऐप: एस)। –

उत्तर

1

ऐसा प्रतीत होता है कि डिज़ाइनर को MergedDictionaries को हल करने में समस्या है जो डिज़ाइन-टाइम पर कोड-बैक में परिभाषित हैं।

ResourceDictionary को अपने प्रारंभ से पहले स्थानांतरित करके एक और भी खराब उदाहरण देखा जा सकता है।

public UserControl1() 
{ 
    this.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("TempProject;component/Resources.xaml", UriKind.RelativeOrAbsolute) }); 
    InitializeComponent(); 
} 

इस मामले में, DynamicResource भी डिजाइन समय में हल करने के लिए, डिजाइन समय दृश्य का संकेत जरूरी कंस्ट्रक्टर्स बुला नहीं है के रूप में आप अपेक्षा कर सकते हैं विफल रहता है। मैंने विजुअल स्टूडियो 2012 के साथ इसका परीक्षण किया, इसलिए 2010 से यह व्यवहार नहीं बदला है।

अपने मूल परीक्षण कोड के संदर्भ में, ध्यान दें कि StaticResource रन-टाइम (लाल सीमा प्रकट होता है) पर अपेक्षित रूप से बाध्य होता है, भले ही डिज़ाइन-टाइम व्यू द्वारा "त्रुटि" फेंक दी गई और लाल सीमा की कमी।

  1. उपयोग DynamicResource जहां आवश्यक डिजाइन-समय पर इन हल करने:

    मैं दो विकल्प देखेंगे। जबकि आप StaticResource का उपयोग कर सकते हैं, संबंधित "त्रुटियां" और डिज़ाइन-टाइम व्यू की कमी स्पष्ट रूप से एक समस्या होगी। अब दो के बीच Other answers seem to indicate there may not be much performance difference

  2. बस अपने UserControl.Resources में संसाधन डिक्शनरी को तुरंत चालू करें, और बेस क्लास से प्राप्त न करें। जबकि आप बेस क्लास का उपयोग करके थोड़ा सा कोड कंडेन कर रहे हैं, आप अब और अधिक कुशल नहीं हैं, क्योंकि प्रत्येक नए ResourceDictionary इंस्टेंस हर बार बनाया जा रहा है। चूंकि आप XAML फ्रंट-एंड के साथ बेस क्लास से (AFAIK) का विस्तार नहीं कर सकते हैं, इसलिए आप इस अवशोषण के इस स्तर पर एक अप्रतिबंधित MergedDictionary होने के खिलाफ संभावित रूप से बहस कर सकते हैं।

+0

धन्यवाद इस समय आपने खर्च किया था। हम वर्तमान में दृष्टिकोण 1 का उपयोग कर रहे हैं लेकिन मैं चेतावनी से थोड़ा चिंतित हूं (भले ही यह चोट न पहुंचे, यह वहां नहीं होना चाहिए)। समाधान 2 यह एक विकल्प नहीं है क्योंकि बेस क्लास संसाधन थोड़ा जटिल हैं (आप रन-टाइम पर एप्लिकेशन की शैली बदल सकते हैं) इसलिए कई संसाधन शब्दकोश शामिल हैं। चीजों को कड़ी मेहनत करने के लिए हम रनटाइम जैसे डिज़ाइनटाइम पर नियंत्रण देखना चाहते हैं, इसलिए हम केवल डिज़ाइनटाइम पर संसाधनों को जोड़ रहे हैं (अन्यथा वे ऐप से आते हैं)। यही कारण है कि हमने आधार उपयोगकर्ता नियंत्रण बनाया ... –

+0

क्या आपको लगता है कि हमें एमएस को एक बग फाइल करना चाहिए? –

+0

@SoMoS मुझे किसी ऐसे व्यक्ति से सुनने में दिलचस्पी होगी जो डिजाइनर कॉल और व्हाट्नॉट के मामले में डिज़ाइनर कैसे काम करता है उससे परिचित है। हालांकि, रनटाइम पर बदलती शैली के मामले में, मैं आम तौर पर 'एप्लिकेशन। स्रोत' स्तर पर 'संसाधन डिक्शनरी' को बदलना चाहता हूं। भले ही आपने उदाहरण में 'संसाधन डिक्शनरी' को स्थिर के रूप में परिभाषित किया हो (भले ही इसे जोड़ा जाने पर साझा किया गया हो), फिर भी आपको मर्ज किए गए डिक्शनरी को प्रति-आवृत्ति आधार पर बदलना होगा, है ना? मुझे यकीन है कि आपका कार्यान्वयन अलग है, लेकिन यह इसके बारे में जाने का एक जटिल तरीका प्रतीत होता है। –

संबंधित मुद्दे