2015-06-08 9 views
7

को तोड़ता है मुझे ListBoxItem एस के साथ कोई समस्या है। मैं ListBoxItem में सभी नियंत्रणों को भी चुनने की कोशिश कर रहा हूं, इसलिए TextBox, Label आदि पर क्लिक करने से ListBoxItem का चयन होगा। अभी तक बहुत सरल है।WPF ListBoxItem ControlTemplate कुछ माउसडाउन/चयन

मैं सीमा को चित्रित करने के लिए पृष्ठभूमि को हाइलाइट करने से चयन दृश्यता को बदलने के लिए ListBoxItem टेम्पलेट भी बदल रहा हूं। भी बहुत आसान है।

इन दो के संयोजन, तथापि, MouseDown और PreviewMouseDown के साथ कुछ सच में परेशान समस्याओं का कारण, एक Grid है, जहां एक बनाता में Label रों के बारे में लगता है विशेष रूप से मेरे मामले में एक "शून्य" Grid अंतरिक्ष के कब्जे में।

स्नूप का उपयोग करना, मैं PreviewMouseDown घटना ListBox अंदर ScrollViewer पर रोक, और ListBoxItem सभी तरह नहीं जा रहा देख सकते हैं।

click no worky

XAML:

<Window x:Class="ListBoxClickThroughTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" 
     Width="525" 
     Height="350"> 
    <Grid> 
     <ListBox ItemsSource="{Binding Items}" 
       SelectionMode="Single"> 

      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="Auto" /> 
          <ColumnDefinition Width="*" /> 
         </Grid.ColumnDefinitions> 
         <Grid.RowDefinitions> 
          <RowDefinition /> 
          <RowDefinition /> 
         </Grid.RowDefinitions> 

         <Label Name="VerySuperLongLabel" 
           Grid.Row="0" 
           Grid.Column="0" 
           HorizontalAlignment="Left" 
           Content="VerySuperLongLabel" 
           Padding="0" /> 

         <TextBox Name="Textbox1" 
           Grid.Row="0" 
           Grid.Column="1" 
           HorizontalAlignment="Stretch" 
           HorizontalContentAlignment="Right" 
           Text="Textbox1 Text" /> 


         <Label Name="ShortLabel" 
           Grid.Row="1" 
           Grid.Column="0" 
           HorizontalAlignment="Left" 
           Content="ShortLabel" 
           Padding="0" /> 
         <TextBox Name="Textbox2" 
           Grid.Row="1" 
           Grid.Column="1" 
           HorizontalAlignment="Stretch" 
           HorizontalContentAlignment="Right" 
           Text="Textbox2 Text" /> 
        </Grid> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 

      <ListBox.ItemContainerStyle> 
       <Style TargetType="{x:Type ListBoxItem}"> 
        <EventSetter Event="PreviewMouseDown" 
           Handler="ListBoxItem_PreviewMouseDown" /> 
        <EventSetter Event="MouseDown" 
           Handler="ListBoxItem_PreviewMouseDown" /> 
        <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
           <Border x:Name="Bd" 
             BorderThickness="1"> 
            <ContentPresenter /> 
           </Border> 
           <ControlTemplate.Triggers> 
            <Trigger Property="IsSelected" Value="true"> 
             <Setter TargetName="Bd" Property="BorderBrush" Value="Gray" /> 
            </Trigger> 
           </ControlTemplate.Triggers> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style> 
      </ListBox.ItemContainerStyle> 
     </ListBox> 

    </Grid> 
</Window> 

कोड-पीछे:

using System.Collections.Generic; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Input; 

namespace ListBoxClickThroughTest 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      Items = new List<string>() { "1", "2" }; 
      InitializeComponent(); 
      DataContext = this; 
     } 

     public List<string> Items { get; set; } 

     private void ListBoxItem_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
     { 
      var listBoxItem = (ListBoxItem)sender; 
      listBoxItem.IsSelected = true; 
     } 
    } 
} 

हालांकि, अगर मैं Template सेटर निकालने के लिए, सब कुछ ठीक है। क्या टेम्पलेट में कुछ जादू है जो मुझे याद आ रही है? मैंने सीमा को "बीडी" में बदलने का प्रयास किया क्योंकि डिफ़ॉल्ट टेम्पलेट सीमा का नाम था, लेकिन कोई भाग्य नहीं था। कोई विचार?

+0

क्या आप दूसरे सूची आइटम के दाईं ओर व्हाइटस्पेस पर क्लिक करते समय सीमा पार करने की कोशिश कर रहे हैं? –

+0

@Aaron, मैं इसके अंदर _anywhere_ पर क्लिक करके 'ListBoxItem' चुनने का प्रयास कर रहा हूं और सीमा के माध्यम से चयन दिखाता हूं (जैसे स्क्रीन शॉट में शीर्ष चयनित आइटम)। कोड "शॉर्टलैबेल" के दाईं ओर शून्य को छोड़कर हर जगह काम करता है। –

+0

पता नहीं था कि आप घटनाओं को देखने के लिए स्नूप का उपयोग कर सकते हैं! – Contango

उत्तर

5

यदि आप "बाएं" से "खिंचाव" से लेबल के क्षैतिज संरेखण को बदलते हैं तो यह समस्या को ठीक करेगा और दृश्य स्वरूपण को वही बनाएगा।

मूसडाउन घटनाएं केवल उन क्षेत्रों में काम करती हैं जहां तत्व मौजूद हैं। लेबल को "बाएं" क्षैतिज संरेखण पर रखते हुए, आप "शून्य" का उल्लेख कर रहे हैं, जहां उस स्तर पर कोई तत्व मौजूद नहीं है जिसे क्लिक किया जा सकता है। अंतर को दृष्टि से देखने के लिए, लेबल तत्वों की पृष्ठभूमि संपत्ति को अस्थायी रूप से सेट करने का प्रयास करें जो आपको समस्याएं दे रहे हैं, और आप देखेंगे कि तत्व टेक्स्टबॉक्स में सभी तरह से विस्तार नहीं करता है।

+0

शानदार! यह मेरे प्रोजेक्ट में एक लंबे समय तक चलने वाली समस्या को हल करता है। – Contango

+0

इतना आसान है। धन्यवाद! मुझे लगा कि 'ListBoxItem' को इस तरह की स्थिति में' माउसडाउन 'ईवेंट मिलेगा जहां शून्य हो। एक बार फिर धन्यवाद! –

+0

कोई विचार क्यों 'ListBoxItem' ईवेंट प्राप्त नहीं कर रहा है? मुझे लगता है कि यह एक अच्छा समाधान है, लेकिन यह स्पष्ट नहीं करता है कि यह घटना 'स्क्रॉलव्यूअर' पर क्यों मरती है। –

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