2013-01-08 38 views
5

मेरे पास एक सिल्वरलाइट एप्लिकेशन है जो ListBox में आइटमों की एक सूची प्रदर्शित करता है। प्रत्येक आइटम अपने आवेदन की एक अलग 'पेज' का प्रतिनिधित्व करता है तो मैं एक शैली है कि ItemContainerStyle संपत्ति है कि इस तरह दिखता है पर लागू होता है है:किसी सूचीबॉक्स आइटम टेम्पलेट/डेटामैप्लेट में बटन का सही तरीके से उपयोग कैसे करें?

<Style x:Key="navigationItemContainerStyle" TargetType="ListBoxItem"> 
    <Setter Property="Margin" Value="5,3"/> 
    <Setter Property="FontSize" Value="16"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate> 
       <Grid Cursor="Hand"> 
        <VisualStateManager.VisualStateGroups> 
         <!-- code omitted --!> 
        </VisualStateManager.VisualStateGroups> 
        <Border x:Name="contentBorder" 
          Background="{StaticResource navigationHighlightBrush}" 
          CornerRadius="3" 
          Opacity="0"/> 
        <ContentControl x:Name="content" 
            Margin="10,5" 
            Content="{Binding}" 
            Foreground="DarkGray"/> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

शैली बहुत सरल है। यह Border प्रदर्शित करता है जब ListBoxItem की दृश्य स्थिति 'चयनित' के बराबर होती है। ध्यान दें कि सामग्री ContentControl द्वारा होस्ट की गई है क्योंकि जब मैं 'चयनित' स्थिति में होता हूं तो Foreground संपत्ति को बदलने में सक्षम होना चाहता हूं।

यह शानदार ढंग से काम करता है के रूप में नीचे स्क्रीनशॉट से देखा जा सकता है:

enter image description here

अब मैं चयनित आइटम नेविगेशन आह्वान करना चाहते हैं इसलिए यह विचार मैं था एक DataTemplate कि प्रत्येक की सामग्री के सेट बनाने के लिए था एक HyperLinkButton के लिए आइटम:

<DataTemplate x:Key="navigationListBoxItemTemplate"> 
    <HyperlinkButton Content="{Binding}" 
        Background="Transparent"/> 
</DataTemplate> 

अब इस ItemTemplate मेजबान के रूप में यह एक ContentControl बजाय एकमें सामग्री है काम नहीं करता हैइसलिए मुझे ListBoxItem टेम्पलेट को ContentPresenter का उपयोग करने के लिए अपडेट करना पड़ा है।

<ContentPresenter x:Name="content" Margin="10,5"/> 

मैं अब निम्नलिखित परिणाम प्राप्त:

enter image description here

जब मैं HyperLinkButtonListBoxItem अब अब चयनित पर क्लिक करें (मैं HyperLinkButton बाहर बस क्लिक कर सकते हैं और ListBoxItem चयनित हो जाता है) । HyperLinkButton पर क्लिक होने पर मैं वास्तव में क्या चाहता हूं ListBoxItem के लिए चुना गया है। HyperLinkButton में चयन की कोई अवधारणा नहीं है इसलिए मैं ListBoxItem की IsSelected संपत्ति से बंध नहीं सकता हूं।

नोट: वास्तविक नेविगेशन पूरी तरह से काम करता है, समस्या पूरी तरह से ListBoxItems की उपस्थिति के साथ है।

तो मेरी प्रश्न हैं:

  1. मैं इसे इसलिए जब HyperLinkButton क्लिक किया जाता है कि कर सकते हैं, ListBoxItem पहली छवि की तरह चयनित हो जाता है?
  2. मुझे HyperLinkButton के अग्रभूमि को बदलने के कुछ तरीके की आवश्यकता होगी जब इसे चुना गया है क्योंकि यह ContentControl को ContentPresenter से स्वैप करने के कारण आइटम टेम्पलेट में अब नहीं किया गया है।

नोट: मैं शायद अपने ViewModel को ListBox की SelectedItem संपत्ति बंधन और वहाँ नेविगेशन से निपटने की आवश्यकता negating एक HyperLinkButton प्रत्येक ListBoxItem द्वारा की मेजबानी की है करने के लिए द्वारा इस समस्या का समाधान कर सकता है, लेकिन मैं अगर यह जानने में दिलचस्पी है मेरे वांछित परिणाम प्राप्त करने के लिए शैलियों और टेम्पलेट का उपयोग करना संभव है।

अद्यतन

मैं कोशिश करते हैं और इसका समाधान करने के चीजों की एक जोड़ी की कोशिश की है, लेकिन अभी तक असफल रही है। पहली बात मैंने कोशिश की मेरी DataTemplate जो अनिवार्य रूप से नियंत्रण से डिफ़ॉल्ट रंग-रूप के सभी दूर करता है और लग रहा है, लेकिन मेरा आवेदन अभी भी जिस तरह से ऊपर वर्णित में बर्ताव करता है में HyperLinkButton नियंत्रित करने के लिए एक नई शैली लागू करने गया था।

दूसरी बात मैंने कोशिश की गलत पर IsHitTestVisible संपत्ति की स्थापना की गई थी। यह मुझे HyperLinkbutton पर 'से' पर क्लिक करने और ListBoxItem का चयन करने की अनुमति देता है लेकिन इसका मतलब है कि नेविगेशन अब अब लागू नहीं हुआ है।

+0

हाय, आप अपने listBox_SelectionChanged() ईवेंट हैंडलर भीतर NavigationService.Navigate (URI) पद्धति का उपयोग करके की कोशिश कर सकते हैं? – prthrokz

+0

@prthrokz - मुझे नेविगेशन विधि का आह्वान करने में कोई समस्या नहीं है। मेरी समस्या पूरी तरह से 'ListBoxItem' की प्रस्तुति के साथ है। –

+0

क्या मेरा इरादा था कि तुम व्यावहारिक रूप से HyperLinkButton जोड़ने, क्योंकि जो मैं पद से समझ गया कि आप इसे करने के लिए स्विच करने के लिए, क्योंकि आप एक नेविगेशन लागू किया जा करना चाहता था था मिटा सकते हैं। – prthrokz

उत्तर

0

ListBoxItem चयनित नहीं क्योंकि बटन (यह है जो कुछ भी प्रकार) MouseLeftButtonDown घटना के रूप में व्यवहार के निशान है। इसलिए आवश्यक घटना अभिभावक ListBoxItem पर बबल नहीं होती है।

जाहिर है, अपने ListBoxItem क्लिक से फोकस हो रही है (मुझे लगता है कि अपने अंतिम छवि में सीमा है), तो यह परवाह किए बिना होना चाहिए।

कवर के तहत, ListBoxItem के पास चयन के साथ निपटने के लिए एक मानक वाममाउसबटन डाउन इवेंट हैंडलर स्थापित होगा, और इसमें सेटिंग फोकस से निपटने के लिए एडहैंडलर को कॉल करना होगा।


आप, घटना के लिए अपने स्वयं के हैंडलर जोड़कर कुछ इसी तरह प्राप्त कर सकते हैं तो जैसे:

listboxitem.AddHandler(UIElement.MouseLeftButtonDownEvent, new System.Windows.Input.MouseButtonEventHandler(MyMouseLeftButtonDownEventHandler), true); 

अंतिम पैरामीटर हैंडलर संभाला ईवेंट प्रबंधित करने के निर्देश देता है ...

इस अटैच किया जा रहा हैंडलर मैं आपको छोड़ देता हूं, लेकिन व्यवहार का उपयोग करना शायद सबसे सीधे आगे है। आप ईवेंट को बटन से एक प्रकार प्राप्त कर सकते हैं और इसे ListBoxItem को खोजने और चुनने के लिए विजुअल ट्री को चला सकते हैं ... संभावनाएं अनंत हैं।

+0

हिंडसाइट में तथ्य यह है कि घटना पहले ही बटन द्वारा संभाली गई थी, स्पष्ट होना चाहिए था। जैसा कि मेरे प्रश्न में बताया गया है कि वास्तव में मेरे पास एक वैकल्पिक समाधान था लेकिन जानकारी अभी भी उपयोगी थी। धन्यवाद। –