2013-01-17 7 views
10

में है, मैं अपनी अधिकांश विंडोज़ से प्राप्त करने के लिए बेस विंडो क्लास बनाने की प्रक्रिया में हूं। जाहिर है इसके लिए सबसे अच्छा समाधान एक अलग वर्ग था, और एक शैली जो उस पर लागू होती है।बेस विंडो के लिए WPF शैली App.xaml में लागू नहीं है, लेकिन थीम्स/जेनेरिक.एक्सएमएल

मुद्दा यह है कि <Style ../> मुझे लागू नहीं किया जा रहा है जब यह App.Resources में है। यही है, अगर इसे बाहरी ResourceDictionary में परिभाषित किया गया है, और App.xaml के संसाधनों में विलय हो गया है, या स्थानीय शब्दकोश और विलय हो गया है, या App.Resources में इनलाइन रखा गया है। <Style ../>, हालांकि, इसे लागू किया जाता है जब इसे Themes/Generic.xaml में रखा जाता है।

समस्या को DefaultStyleKeyProperty ओवरराइड करने के अलावा, बेस विंडो में कुछ भी विशेष किए बिना प्रदर्शित किया जा सकता है।

नीचे ThemeWindow है:

<Style TargetType="{x:Type testing:ThemeWindow}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type testing:ThemeWindow}"> 
       <Grid> 
        <Grid.Background> 
         <SolidColorBrush Color="Red"/> 
        </Grid.Background> 
        <AdornerDecorator> 
         <ContentPresenter /> 
        </AdornerDecorator> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

MainWindowThemeWindow का उपयोग करता है:

public class ThemeWindow : Window 
{ 
    static ThemeWindow() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(ThemeWindow), new FrameworkPropertyMetadata(typeof(ThemeWindow))); 
    } 
} 

यहाँ बहुत ही सरल <Style ../> मैं लागू करने के लिए (यह Window पृष्ठभूमि लाल, ज्यादा कुछ नहीं है) कोशिश कर रहा हूँ है , बस निम्नलिखित एक्सएएमएल है:

<testing:ThemeWindow x:Class="Testing.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:testing="clr-namespace:Testing" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Button Content="Button" HorizontalAlignment="Left" Margin="125,83,0,0" VerticalAlignment="Top" Width="75"/> 
    </Grid> 
</testing:ThemeWindow> 

अब, कहा गया है, अगर आप अपने स्वयं के ResourceDictionary में जगह कि Style, और यह शामिल इस तरह के रूप में:

<App.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/Themes/ThemeWindow.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</App.Resources> 

.. यह काम नहीं करता। यदि आप शैली को सीधे App.Resources में रेखांकित करते हैं, तो यह काम नहीं करता है।

केवल स्थिति मैं यह काम कर रहा पा सकते हैं ResourceDictionary XAML Generic.xaml कहते हैं, और आवेदन की Themes/ निर्देशिका में यह जगह है।

मुझे आश्चर्य है कि यह क्यों हो रहा है।

मेरी केवल सिद्धांत है कि जब WPF एक नियंत्रण प्रकार देखता है, यह Themes को सामने होगा, और प्रकार के लिए सभी ResourceDictionary रों स्कैन करते हैं, तो Generic.xaml वापस करने के लिए आते हैं और इसे लोड है। यह स्पष्ट नहीं करता है कि <Style /> मर्ज किए गए ResourceDictionary में उपलब्ध होने पर यह क्यों लोड नहीं होगा। नोट यह स्पष्ट करता है कि MergedDictionary को Generic.xaml में स्पष्ट कारणों से रखा गया है।

ResourceDictionary को Generic.xaml में विलय करने के साथ मैं बिल्कुल ठीक हूं, अगर मुझे ऐसा करना है। मैं सिर्फ तकनीकी विवरणों पर उतरना चाहता हूं कि इसे ऐसा क्यों होना चाहिए।

इस काम नहीं कर रहा/काम के स्क्रीनशॉट: Broken Image Working Image

उत्तर

3

मैं एक सरल समाधान का है कि आप अपने शैली सेट करने के लिए आप में App.xaml की अनुमति होगी है।

ऐप में अपनी शैली को परिभाषित करें।इस तरह XAML:

<Style x:Key="{x:Type testing:ThemeWindow}" TargetType="{x:Type testing:ThemeWindow}"> 

और यह करने के लिए अपने ThemWindow बदलने के लिए:

public class ThemeWindow : Window 
{ 
    static ThemeWindow() 
    { 
     StyleProperty.OverrideMetadata(typeof(ThemeWindow), new FrameworkPropertyMetadata(GetDefautlStyle())); 
    } 

    private static Style GetDefautlStyle() 
    { 
     if (defaultStyle == null) 
     { 
      defaultStyle = Application.Current.FindResource(typeof(ThemeWindow)) as Style; 
     } 
     return defaultStyle; 
    } 

    private static Style defaultStyle = null; 
} 

यह वास्तव में सवाल का समाधान नहीं करता है, लेकिन है कि आप को प्राप्त करने के आपको क्या चाहिए की अनुमति होगी!

संपादित करें:DefaultStyleKey संदर्भ को देखते हुए, यह स्पष्ट रूप से कहा है कि यह विषय शैली देखने के लिए प्रयोग किया जाता है। यह बताता है कि इसे ऐप.एक्सएएमएल या किसी अन्य शब्दकोश में क्यों नहीं मिलेगा। यह केवल थीम शब्दकोशों में खोज करेगा। तो आपको या तो थीम शैली में अपनी शैली को परिभाषित करना होगा, या उपरोक्त उदाहरण में स्टाइल प्रॉपर्टी का उपयोग सीधे करना होगा।

+0

क्यों आप एक स्थिर चर में स्टोर 'defaultStyle' करते हैं? यह देखते हुए कि इसे स्थैतिक कन्स्ट्रक्टर से बुलाया जाता है, इसे केवल एक बार बुलाया जाएगा ... –

+1

मैंने दो साल से अधिक कोड लिखा था, इसलिए मुझे ईमानदारी से इस स्थिर क्षेत्र से संबंधित प्रेरणा याद नहीं है। आप स्पष्ट रूप से सही हैं और यह क्षेत्र आवश्यक नहीं है। – Sisyphe

0

मैं निम्नलिखित समाधान के आसपास आ गया हूं जो पहले से ही स्टैक ओवरफ्लो में चर्चा की गई है। एप्लिकेशन के लोड होने पर लोड लोड में जोड़ना होगा।

Refer Solution

+0

दुर्भाग्य से, यह एक ही मुद्दा नहीं है। –

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