/ / WPF शैली के कारण लूप - wpf, xaml, शैलियाँ, स्टैक-ओवरफ़्लो

डब्ल्यूपीएफ शैली लूप - wpf, xaml, शैलियों, ढेर-ओवरफ्लो का कारण बनती है

निम्नलिखित XAML कुछ विषयों के साथ स्टैक ओवरफ़्लो अपवाद का कारण क्यों बनता है?

<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="ExpressionLight.xaml"/>
</ResourceDictionary.MergedDictionaries>
<Style x:Key="BaseButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}">
<Setter Property="Margin" Value="5"/>
</Style>
<Style TargetType="{x:Type Button}"  BasedOn="{StaticResource BaseButtonStyle}"/>
</ResourceDictionary>
</Application.Resources>

मैंने इंटरनेट पर पाए जाने वाले कई विषयों की कोशिश की है और उनमें से लगभग आधे अपवाद का कारण है।

क्या नाम रखने का एक और तरीका है Style जैसे अकरण?

संपादित करें:

समस्या यह है कि Theme संसाधन शब्दकोश में डिफ़ॉल्ट शैली जोड़ता है (नाम के साथ एक प्रविष्टि System.Windows.Control.Button)। चूंकि एक शब्दकोश में प्रत्येक कुंजी के लिए एक ही प्रविष्टि हो सकती है, इसलिए संभव नहीं है कि एक ही संसाधन शब्दकोश में एक नया डिफ़ॉल्ट जोड़ा जा सके।

डॉन "नहीं जानता कि यह" डुप्लिकेट कुंजी "अपवाद के बजाय" स्टैकओवरफ़्लो "की ओर क्यों जाता है। यह संभवतः विलय किए गए शब्दकोशों की विशेष हैंडलिंग के कारण होता है जिसमें डुप्लिकेट कुंजियाँ हो सकती हैं।

नाम को लागू करने के लिए समाधान है Style कोड में डिफ़ॉल्ट के रूप में:

void AppStartup(object sender, StartupEventArgs args) {
this.Resources[typeof(Button)] = this.Resources["BaseButtonStyle"];
....
}

के बाद से BaseButtonStyle निश्चित रूप से इस विषय के लिए बाध्य है यह निश्चित रूप से इस समाधान के साथ क्रम में विषय बदलने के लिए संभव नहीं है।

उत्तर:

जवाब के लिए 2 № 1

आपको इस कोड में परिपत्र निर्भरता हो रही है:

<Style x:Key="BaseButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}">
<Setter Property="Margin" Value="5"/>
</Style>

इस शैली का कहना है कि यह TargetType बटन के लिए है,कोई बात नहीं। यह यह भी कहता है कि यह आधार शैली है जो टारगेट टाइप बटन के लिए परिभाषित है, जो कि यह स्वयं है। पिछली शैली की कुंजी असाइन करने के लिए बेहतर है और फिर आधार में उस कुंजी का उपयोग करें।

संपादित करें:

अपने कोड के माध्यम से जाने के बाद फिर से ऐसा लगता हैआपकी शैली और ExpressionLight.xaml में परिभाषित शैली के बीच एक परिपत्र संदर्भ है। विभिन्न स्तरों पर संसाधनों को रखने के लिए एक वर्कअराउंड होगा।

<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="ExpressionLight.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid>
<Grid.Resources>
<Style x:Key="BaseButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}">
<Setter Property="Margin" Value="5"/>
</Style>
<Style TargetType="{x:Type Button}"  BasedOn="{StaticResource BaseButtonStyle}"/>
</Grid.Resources>
............
...........
...........
</Grid>