WPF उपयोगकर्ता नियंत्रण में आयातित और स्थानीय संसाधनों को कैसे संयोजित करें


82

मैं कई WPF उपयोगकर्ता नियंत्रण लिख रहा हूँ, जिन्हें साझा और व्यक्तिगत संसाधनों दोनों की आवश्यकता है।

मैंने एक अलग संसाधन फ़ाइल से संसाधनों को लोड करने के लिए सिंटैक्स का पता लगाया है:

<UserControl.Resources>
    <ResourceDictionary Source="ViewResources.xaml" />
</UserControl.Resources>

हालाँकि, जब मैं ऐसा करता हूं, तो मैं स्थानीय स्तर पर संसाधन नहीं जोड़ सकता, जैसे:

<UserControl.Resources>
    <ResourceDictionary Source="ViewResources.xaml" />
    <!-- Doesn't work: -->
    <ControlTemplate x:Key="validationTemplate">
        ...
    </ControlTemplate>
    <style x:key="textBoxWithError" TargetType="{x:Type TextBox}">
        ...
    </style>
    ...
</UserControl.Resources>

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

मुझे तुच्छ कुछ याद आ रहा होगा?

यह उल्लेख किया जाना चाहिए: मैं WinForms परियोजना में अपने उपयोगकर्ता नियंत्रणों की मेजबानी कर रहा हूं, इसलिए App.xaml में साझा संसाधन डालना वास्तव में एक विकल्प नहीं है।

जवाबों:


157

मैं यह समझ गया। समाधान में मर्ज किए गए डिक्शनरी शामिल हैं, लेकिन इस तरह की बारीकियों को सही होना चाहिए:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="ViewResources.xaml" />
        </ResourceDictionary.MergedDictionaries>
        <!-- This works: -->
        <ControlTemplate x:Key="validationTemplate">
            ...
        </ControlTemplate>
        <style x:key="textBoxWithError" TargetType="{x:Type TextBox}">
            ...
        </style>
        ...
    </ResourceDictionary>
</UserControl.Resources>

यही है, संसाधन संसाधन टैग के भीतर स्थानीय संसाधनों को नेस्टेड किया जाना चाहिए । इसलिए यहां उदाहरण गलत है।


5

आप मर्ज किए गए डिक्शनरी अनुभाग के अंदर स्थानीय संसाधनों को परिभाषित कर सकते हैं:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <!-- import resources from external files -->
            <ResourceDictionary Source="ViewResources.xaml" />

            <ResourceDictionary>
                <!-- put local resources here -->
                <Style x:key="textBoxWithError" TargetType="{x:Type TextBox}">
                    ...
                </Style>
                ...
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

5

मर्ज किए गए शब्दकोश का उपयोग करें ।

मुझे यहाँ से निम्न उदाहरण मिला

file1

<ResourceDictionary 
  xmlns=" http://schemas.microsoft.com/winfx/2006/xaml/presentation "
  xmlns:x=" http://schemas.microsoft.com/winfx/2006/xaml " > 
  <Style TargetType="{x:Type TextBlock}" x:Key="TextStyle">
    <Setter Property="FontFamily" Value="Lucida Sans" />
    <Setter Property="FontSize" Value="22" />
    <Setter Property="Foreground" Value="#58290A" />
  </Style>
</ResourceDictionary>

फाइल 2

   <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
          <ResourceDictionary Source="TextStyle.xaml" />
        </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary> 

धन्यवाद, लेकिन भाग्य नहीं। उसका उदाहरण सही लगता है, लेकिन वास्तव में काम नहीं करता है। मुझे संदेश मिलता है "संपत्ति 'संसाधन' एक से अधिक बार सेट किया गया है"।
Tor Haugen

मुझे MergedD शब्दकोशों के बारे में पता है। लेकिन वे मुझे स्थानीय रूप से परिभाषित संसाधनों के साथ एक बाहरी शब्दकोश संदर्भ को संयोजित करने की अनुमति नहीं देते हैं। जैसा कि पहले ही कहा गया है, आपके द्वारा संदर्भित पृष्ठ पर एक उदाहरण है, लेकिन यह काम नहीं करता है।
Tor Haugen

2
किसी के लिए भी कि "एक से अधिक बार सेट करें" त्रुटि: प्रत्येक अन्य संसाधनों को पहले <संसाधन छाया> टैग के भीतर होना चाहिए।
हेक्सो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.