को तोड़ता है मुझे ListBoxItem
एस के साथ कोई समस्या है। मैं ListBoxItem
में सभी नियंत्रणों को भी चुनने की कोशिश कर रहा हूं, इसलिए TextBox
, Label
आदि पर क्लिक करने से ListBoxItem
का चयन होगा। अभी तक बहुत सरल है।WPF ListBoxItem ControlTemplate कुछ माउसडाउन/चयन
मैं सीमा को चित्रित करने के लिए पृष्ठभूमि को हाइलाइट करने से चयन दृश्यता को बदलने के लिए ListBoxItem
टेम्पलेट भी बदल रहा हूं। भी बहुत आसान है।
इन दो के संयोजन, तथापि, MouseDown
और PreviewMouseDown
के साथ कुछ सच में परेशान समस्याओं का कारण, एक Grid
है, जहां एक बनाता में Label
रों के बारे में लगता है विशेष रूप से मेरे मामले में एक "शून्य" Grid
अंतरिक्ष के कब्जे में।
स्नूप का उपयोग करना, मैं PreviewMouseDown
घटना ListBox
अंदर ScrollViewer
पर रोक, और ListBoxItem
सभी तरह नहीं जा रहा देख सकते हैं।
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
सेटर निकालने के लिए, सब कुछ ठीक है। क्या टेम्पलेट में कुछ जादू है जो मुझे याद आ रही है? मैंने सीमा को "बीडी" में बदलने का प्रयास किया क्योंकि डिफ़ॉल्ट टेम्पलेट सीमा का नाम था, लेकिन कोई भाग्य नहीं था। कोई विचार?
क्या आप दूसरे सूची आइटम के दाईं ओर व्हाइटस्पेस पर क्लिक करते समय सीमा पार करने की कोशिश कर रहे हैं? –
@Aaron, मैं इसके अंदर _anywhere_ पर क्लिक करके 'ListBoxItem' चुनने का प्रयास कर रहा हूं और सीमा के माध्यम से चयन दिखाता हूं (जैसे स्क्रीन शॉट में शीर्ष चयनित आइटम)। कोड "शॉर्टलैबेल" के दाईं ओर शून्य को छोड़कर हर जगह काम करता है। –
पता नहीं था कि आप घटनाओं को देखने के लिए स्नूप का उपयोग कर सकते हैं! – Contango