2013-01-08 17 views
5

ListBox ürünündeki öğelerin listesini görüntüleyen bir Silverlight uygulamasına sahibim.Liste kutusu itemtemplate/datatemplate içindeki bir düğmeyi doğru kullanmak nasıl?

<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> 

tarzı çok basittir: Her öğe yüzden şöyle ItemContainerStyle mülkiyet uygulanan bir stili var benim uygulamanın farklı bir 'sayfası' temsil eder. ListBoxItem'un görsel durumu 'Seçili' değerine eşit olduğunda Border'u gösterir. Öğe, 'Seçili' durumda olduğunda Foreground özelliğini değiştirmek istediğim için içeriğin bir ContentControl tarafından barındırıldığına dikkat edin. Ben fikri her içeriğini ayarlayan bir DataTemplate yaratmaktı yüzden

enter image description here

Şimdi Seçilen öğe navigasyonu çağırmak istiyorum:

Bu aşağıdaki ekran ile görülebileceği gibi zekice çalışır bir HyperLinkButton öğe:

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

Şimdi bu bir ContentControl yerineiçerik var ItemTemplate ana gibi çalışmıyorbu yüzdenşablonunu güncellemek için ContentPresenter kullanmak zorunda kaldım.

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

Şimdi aşağıdaki sonucu elde: Şimdi artık seçili HyperLinkButtonListBoxItem tıkladığınızda

enter image description here

(I HyperLinkButton dışında sadece tıklayabilir ve ListBoxItem seçilmiş olur) . Gerçekten istediğim, HyperLinkButton tıklandığında ListBoxItem'un seçilmesidir. HyperLinkButton'un hiçbir seçim konsepti yoktur, bu nedenle ListBoxItem'un IsSelected özelliğine bağlanamıyorum.

Not: Gerçek gezinme mükemmel bir şekilde çalışıyor, sorun yalnızca ListBoxItems'un görünümü ile ilgilidir.

Yani benim sorular şunlardır:

  1. Ben HyperLinkButton tıklandığında böylece yapabilir, ListBoxItem ilk görüntü gibi seçilmiş olur? ContentControl ve ContentPresenter değiştirmeleri nedeniyle, öğe şablonunda artık yapılmadığından seçildiğinde, HyperLinkButton'un ön alanını değiştirmenin bir yoluna da ihtiyacım olacaktır.

Not: Herhalde benim ViewModel ListBox arasında SelectedItem özelliği bağlayıcı ve her ListBoxItem tarafından barındırılan bir HyperLinkButton olması şartı negating orada navigasyonu ele bu sorunu çözebilir ama eğer bilerek ilgileniyorum İstenilen sonuca ulaşmak için stilleri ve şablonları kullanmak mümkün.

denemek ve bu sorunu çözmek için bir kaç şey denedim ama şimdiye kadar başarısız olmuştur

Güncelleme. Denediğim ilk şey, DataTemplate'umdaki HyperLinkButton kontrolüne yeni bir stil uyguluyordu; bu, kontrolün tüm varsayılan görünümünü ve hissini esas olarak ortadan kaldırıyordu ancak uygulama hala yukarıda açıklanan şekilde davranıyor.

Denediğim ikinci şey, IsHitTestVisible özelliğini false olarak ayarlamaktı. Bu, HyperLinkbutton'u 'tıklatmama' ve ListBoxItem'u seçmeme izin veriyor, ancak bu, artık navigasyonun artık geçerli olmadığı anlamına geliyor.

+0

Merhaba, Listenizdeki NavigationService.Navigate (Uri) yöntemini kullanmayı deneyebilirsiniz Box_SelectionChanged() olay işleyicisi? – prthrokz

+0

@prthrokz - Navigasyon yöntemini çağırırken sorun yaşıyorum. Benim sorunum sadece 'ListBoxItem's sunumu ile. –

+0

Niyetim, HyperLinkButton'u eklemeyi hemen hemen atlayabilmekti, çünkü yayından anladığım şey, bir navigasyonun çağrılmasını istediğiniz için ona geçmeniz gerektiğiydi. – prthrokz

cevap

0

Düğme (ne tür olursa olsun) Handled olarak MouseLeftButtonDown olayını işaretlediği için ListBoxItem seçili değildir. Bu nedenle, gerekli olay ana ListBoxItem'e kadar kabarcık oluşturmaz.

Açık bir şekilde, ListBoxItem öğeniz tıklatıldığında odaklanıyor (son görüntünüzdeki kenarlık olduğunu varsayalım);

Kapaklar altında, ListBoxItem, Selection ile başa çıkmak için ayarlanmış standart bir LeftMouseButtonDown olay işleyicisine sahip olacak ve ayar odağıyla başa çıkmak için AddHandler çağrısı olmalıdır.


Sen, olay için kendi işleyicisi ekleyerek benzer bir şey elde şöyle olabilir

: Bu ekleme

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

son parametre ele olayları işlemek için işleyici talimatı ...

işleyici size bırakıyorum, ama bir davranış kullanmak muhtemelen en ileri doğrudur. Olay, Button'dan bir tür türetebilir ve ListBoxItem'i bulmak ve seçmek için Görsel Ağaca doğru yürütebilir ... Olasılıklar sonsuzdur.

+0

Geçmişte, olayın zaten düğme tarafından ele alınmış olması gerçeği açık olmalıydı. Sorumlulukta bahsettiğim gibi, aslında alternatif bir çözüm vardı, ancak bilgi hala işe yarardı. Teşekkür ederim. –

İlgili konular