2016-03-08 9 views
6

गायब हो जाता है निम्नलिखित सरल कोड विंडो में परिभाषित मेनूइटम का पुन: उपयोग करने का प्रयास करता है। दो अलग मेनू पर स्रोत।डब्ल्यूपीएफ एक्सएएमएल परिभाषित मेनूइटम रीयूज काम करना शुरू कर देता है, फिर

<Window x:Class="WpfApplication.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:collections="clr-namespace:System.Collections;assembly=mscorlib" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
    <collections:ArrayList x:Key="menuItemValues"> 
     <MenuItem Header="First"/> 
     <MenuItem Header="Second"/> 
     <MenuItem Header="Third"/> 
    </collections:ArrayList> 
    <MenuItem x:Key="menuItem" x:Shared="False" 
       ItemsSource="{StaticResource menuItemValues}" 
       Header="Shared menu item"/> 
    </Window.Resources> 
    <StackPanel> 
    <Menu HorizontalAlignment="Left" VerticalAlignment="Top"> 
     <StaticResource ResourceKey="menuItem"/> 
     <StaticResource ResourceKey="menuItem"/> 
    </Menu> 
    </StackPanel> 
</Window> 

यह बहुत अच्छा शुरू होता है और जब आप मेनू का चयन करते हैं, तो सभी ठीक दिखते हैं।

enter image description here

लेकिन जब आप पहली बार मेनू में वापस नेविगेट, MenuItems गायब हो जाते हैं:

enter image description here पहले मेनू वांछित MenuItems,

enter image description here

तो दूसरा करता है

कोई बता सकता है कि मेनू गायब क्यों होता है और एक इसे काम करने के लिए रास्ता?

यह एक अन्य SO question की जांच करते समय खोजा गया था जो अपवाद प्राप्त कर रहा था। मैंने another SO question पर चर्चा की गई रणनीति का उपयोग करने की कोशिश की और यह तब तक समस्या को हल करने लग रहा था जब तक कि आप दूसरी बार मेनू पर नेविगेट नहीं करते और यह गायब हो जाता है।

मैं 2 अलग मशीनों पर इस मुद्दे reproduced है:

  1. विन 10, VS2013 ULT V12.0.40629.00 अद्यतन 5, .नेट V4.6.0138
  2. 7 विन, VS2013 प्रेम V12.0.31101। 00 अद्यतन 4, .नेट V4.5.51209
+0

ध्यान में रखते हुए कि यह कैसे इस्तेमाल किया जा रहा है, तो आप का प्रयास किया 'स्टेटिक के बजाय DynamicResource'? –

+0

@ChrisW। - अच्छा सुझाव - मैंने बस टैग को स्विच करने का प्रयास किया और इसके कारण 'XAMLParseException: A' DynamicResourceExtension 'केवल निर्भरता ऑब्जेक्ट की निर्भरता प्रॉपर्टी पर सेट किया जा सकता है। – Taterhead

+0

आह हाँ, आइटमसोर्स, समझ में आता है। हम्म, मैं कोशिश करूँगा और उस पर स्टू करूंगा। –

उत्तर

7

इसका कारण यह है क्या हो रहा है, जबकि उच्च-स्तरीय MenuItemx:Shared="False" है, अपने संग्रह में MenuItem ऑब्जेक्ट नहीं है। उन्हें ArrayList संग्रह में प्रत्येक बार घोषित किया जाता है, और फिर बनाए गए menuItem ऑब्जेक्ट के प्रत्येक उदाहरण में पुन: उपयोग किया जाता है।

कोड को काम करने के लिए, आपको नए उदाहरण बनाने के लिए WPF को मजबूर करने की आवश्यकता होगी। एक विकल्प संग्रह में x:Shared="False" भी लागू करना होगा। उदाहरण के लिए:

<Window x:Class="WpfApplication.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:collections="clr-namespace:System.Collections;assembly=mscorlib" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
    <collections:ArrayList x:Key="menuItemValues" x:Shared="False"> 
     <MenuItem Header="First"/> 
     <MenuItem Header="Second"/> 
     <MenuItem Header="Third"/> 
    </collections:ArrayList> 
    <MenuItem x:Key="menuItem" x:Shared="False" 
       ItemsSource="{StaticResource menuItemValues}" 
       Header="Shared menu item"/> 
    </Window.Resources> 
    <StackPanel> 
    <Menu HorizontalAlignment="Left" VerticalAlignment="Top"> 
     <StaticResource ResourceKey="menuItem"/> 
     <StaticResource ResourceKey="menuItem"/> 
    </Menu> 
    </StackPanel> 
</Window> 
बेशक

, यह देखते हुए कि आइटम बस Header मान दिया जाता है, तो आप सिर्फ, डिफ़ॉल्ट MenuItem templating व्यवहार इस्तेमाल कर सकते हैं MenuItem मूल्यों के बजाय string अर्थ प्रदान करते हुए। यह आपको संग्रह ही (जो पुनः उपयोग के लिए कोई अंतर्निहित अक्षमता है) पुनः उपयोग कर सकते:

<Window x:Class="WpfApplication.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:s="clr-namespace:System;assembly=mscorlib" 
     xmlns:collections="clr-namespace:System.Collections;assembly=mscorlib" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
    <collections:ArrayList x:Key="menuItemValues"> 
     <s:String>First</s:String> 
     <s:String>Second</s:String> 
     <s:String>Third</s:String> 
    </collections:ArrayList> 
    <MenuItem x:Key="menuItem" x:Shared="False" 
       ItemsSource="{StaticResource menuItemValues}" 
       Header="Shared menu item"/> 
    </Window.Resources> 
    <StackPanel> 
    <Menu HorizontalAlignment="Left" VerticalAlignment="Top"> 
     <StaticResource ResourceKey="menuItem"/> 
     <StaticResource ResourceKey="menuItem"/> 
    </Menu> 
    </StackPanel> 
</Window> 
+0

ओह एफएफएस, एक्स: साझा, चेहरा हथेली, +1 महान स्पष्टीकरण! –

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