में है, मैं अपनी अधिकांश विंडोज़ से प्राप्त करने के लिए बेस विंडो क्लास बनाने की प्रक्रिया में हूं। जाहिर है इसके लिए सबसे अच्छा समाधान एक अलग वर्ग था, और एक शैली जो उस पर लागू होती है।बेस विंडो के लिए 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>
MainWindow
ThemeWindow
का उपयोग करता है:
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
में विलय करने के साथ मैं बिल्कुल ठीक हूं, अगर मुझे ऐसा करना है। मैं सिर्फ तकनीकी विवरणों पर उतरना चाहता हूं कि इसे ऐसा क्यों होना चाहिए।
इस काम नहीं कर रहा/काम के स्क्रीनशॉट:
क्यों आप एक स्थिर चर में स्टोर 'defaultStyle' करते हैं? यह देखते हुए कि इसे स्थैतिक कन्स्ट्रक्टर से बुलाया जाता है, इसे केवल एक बार बुलाया जाएगा ... –
मैंने दो साल से अधिक कोड लिखा था, इसलिए मुझे ईमानदारी से इस स्थिर क्षेत्र से संबंधित प्रेरणा याद नहीं है। आप स्पष्ट रूप से सही हैं और यह क्षेत्र आवश्यक नहीं है। – Sisyphe