2013-03-26 6 views
6

पहले कोड मैं से क्या शुरू हो गया था की एक "पथ" के लिए बाध्य:गतिशील संसाधन

<ribbon:RibbonMenuButton IsEnabled="{Binding ForegroundIsConfigurable}" 
      SmallImageSource="{Binding Source={StaticResource imageSource}, 
          Path=Source, 
          UpdateSourceTrigger=OnPropertyChanged}"> 

हालांकि यह बाध्यकारी संकलन है और ठीक कारण मैं संतुष्ट नहीं हूँ चल रहा है कि रनटाइम के दौरान imageSource परिवर्तन है।

StaticResource Markup Extension : Provides a value for any XAML property attribute by looking up a reference to an already defined resource. Lookup behavior for that resource is analogous to load-time lookup, which will look for resources that were previously loaded from the markup of the current XAML page as well as other application sources, and will generate that resource value as the property value in the run-time objects.

के बाद से imageSource मान रनटाइम के दौरान बदल रहा है मैं DynamicResource को StaticResource बदलना पड़ा। लेकिन संपत्ति Source निर्भरता संपत्ति नहीं है और इस प्रकार निम्नलिखित कोड एक रनटाइम त्रुटि बढ़ा देंगे:

SmallImageSource="{Binding Source={DynamicResource imageSource}, 
        Path=Source, 
        UpdateSourceTrigger=LostFocus} 

यही कारण है कि मैं SmallImageSource के लिए सीधे गतिशील संसाधन बाध्य करने के लिए की जरूरत है, जो एक निर्भरता संपत्ति है के लिए:

SmallImageSource="{DynamicResource imageSource}" 

यह फिर से रनटाइम त्रुटि उठाएगा क्योंकि imageSourceImage का प्रकार है। SmallImageSource मान को ImageSource का प्रकार होने की उम्मीद है।

कोई अब मेरे गतिशील संसाधन में डेटा संदर्भ सेट करने और उचित रूप से संपत्ति को बांधने का सुझाव दे सकता है। अगर मैं ऐसा करता हूं, तो मैं संपत्ति IsEnabled की बाध्यकारी को मार दूंगा जिसमें DataContext है।

और जहां तक ​​मुझे पता है, MultiBinding भी एक समाधान नहीं है क्योंकि यह कई स्रोतों के खिलाफ संपत्ति को बांधने के लिए एक तंत्र प्रदान करता है लेकिन विभिन्न संदर्भों और स्रोतों के खिलाफ बाध्यकारी विभिन्न गुण प्रदान नहीं करता है।

इस बारे में सोचते समय, यह मेरे दिमाग में आया कि सौभाग्य से मैं ImageSource rigmarole को IValueConverter में स्थानांतरित कर सकता हूं। मेरे RibbonMenuButton के दिए गए डेटा संदर्भ में मेरे पास उपयुक्त मान के साथ एक स्ट्रिंग मान है जो वास्तव में मेरे ImageSource का स्रोत भी है।

वैसे भी, मैं अब भी सोच रहा हूं कि अगर मैं अन्य दृष्टिकोण नहीं था, तो मैं समस्या का समाधान कैसे करूंगा, यानी यदि दोनों स्रोत विभिन्न डेटा संदर्भों में थे। क्या कुछ ऐसा है जो मैं नहीं देख रहा हूं? मैं कैसे सुनिश्चित कर सकता हूं कि DataContext को ओवरराइट करके अन्य बाध्यकारी को मारना न भूलें और गतिशील संसाधन की संपत्ति के खिलाफ बाध्यकारी हो?


imageSource सुंदर DrawingImage msdn page पर XAML उदाहरण के रूप में एक ही है।

<Image x:Key="imageSource"> 
    <Image.Source> 
    <DrawingImage> 
... 
+0

क्या आप कोड पोस्ट कर सकते हैं जहां आप "छवि स्रोत" संसाधन को परिभाषित करते हैं? –

उत्तर

1

आप एक ImageSource के बजाय एक Image के रूप में "imageResource" को परिभाषित करने की कोशिश हो सकती है। यह मेरे लिए काम करता है।

<r:RibbonWindow 
    x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:r="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary" 
    xmlns:pc="clr-namespace:System.Windows.Media;assembly=PresentationCore"> 
    <Grid> 
     <Grid.Resources> 
      <pc:ImageSource x:Key="imageSource">your_image.png</pc:ImageSource> 
     </Grid.Resources> 
     <r:Ribbon> 
      <r:RibbonMenuButton 
       IsEnabled="{Binding ForegroundIsConfigurable}" 
       SmallImageSource="{DynamicResource imageSource}"> 
      </r:RibbonMenuButton> 
     </r:Ribbon> 
    </Grid> 
</r:RibbonWindow> 

इसके अलावा, आप इस प्रकार बाध्यकारी एक ElementName का उपयोग करके IsEnabled अधिभावी के बिना अपने RibbonMenuButton की DataContext सेट कर सकते हैं।

<r:RibbonWindow x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:r="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary" 
     Title="MainWindow" Height="350" Width="525"> 

    <Grid x:Name="root"> 

     <Grid.Resources> 
      <Image x:Key="imageSource" Source="{Binding myImageSource}"/> 
     </Grid.Resources> 

     <r:Ribbon> 
      <r:RibbonMenuButton DataContext="{DynamicResource imageSource}" 
       IsEnabled="{Binding ElementName=Root, Path=DataContext.ForegroundIsConfigurable}" 
       SmallImageSource="{Binding Source}"/> 
     </r:Ribbon> 
    </Grid> 
</r:RibbonWindow> 
+0

मुझे लगता है कि दूसरा विचार काम कर सकता है। कल कोशिश करेंगे। पहला विचार, हालांकि, काम नहीं करेगा। मैं यह उल्लेख करना भूल गया कि मैं खुद छवि को पेंट करता हूं, लिंक करने के लिए छवि नहीं है। – Em1

+0

@ Em1 पहले विचार के बारे में, यदि आप अपनी छवियों को चित्रित करने वाले कोड से उस तक पहुंच प्राप्त करते हैं, तो आप फ्लाई पर संसाधन शब्दकोश की छवि स्रोत कुंजी अपडेट कर सकते हैं। –

+0

मैंने अभी दूसरे दृष्टिकोण का परीक्षण किया। किसी कारण से यह मेरे लिए ElementName के साथ काम नहीं करता लेकिन सापेक्ष स्रोत के साथ। - मैंने एक्सएएमएल में छवि पेंट की है, मैंने इसके बारे में सवाल अपडेट किया है। मैंने इस मुद्दे में डीबग नहीं किया था कि जब छवि स्रोत का उपयोग सीधे किया जा रहा है (Image.Source की बजाय) सामग्री को जोड़ा नहीं जा सकता है। – Em1

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