আমি কীভাবে একটি তালিকা বাক্সে নির্বাচনটি অক্ষম করব?
আমি কীভাবে একটি তালিকা বাক্সে নির্বাচনটি অক্ষম করব?
উত্তর:
ItemsControl
আপনার অন্যান্য দিকগুলির প্রয়োজন না হলে আপনি পরিবর্তে ListBox
ব্যবহার করতে পারেন ItemsControl
। এটি আইটেমগুলিতে রাখে ItemsPanel
এবং নির্বাচনের ধারণা নেই।
<ItemsControl ItemsSource="{Binding MyItems}" />
ডিফল্টরূপে, ItemsControl
তার শিশু উপাদানগুলির ভার্চুয়ালাইজেশন সমর্থন করে না। আপনার যদি প্রচুর আইটেম থাকে তবে ভার্চুয়ালাইজেশন মেমরির ব্যবহার হ্রাস করতে এবং কর্মক্ষমতা উন্নত করতে পারে ListBox
, সেক্ষেত্রে আপনি পদ্ধতির ২ এবং স্টাইলটি ব্যবহার করতে পারেন বা আপনার ভার্চুয়ালাইজেশন যুক্ত করতে পারেনItemsControl
।
ListBox
বিকল্পভাবে, কেবল তালিকাবক্সকে এমন স্টাইল করুন যাতে নির্বাচনটি দৃশ্যমান হয় না।
<ListBox.Resources>
<Style TargetType="ListBoxItem">
<Style.Resources>
<!-- SelectedItem with focus -->
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
Color="Transparent" />
<!-- SelectedItem without focus -->
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}"
Color="Transparent" />
<!-- SelectedItem text foreground -->
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}"
Color="Black" />
</Style.Resources>
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
</Style>
</ListBox.Resources>
ItemsControl
নির্বাচনের যে কোনও ধারণা সম্পূর্ণরূপে মুছে ফেলা হবে।
আমি আমার জন্য কাজ করে একটি খুব সহজ এবং সোজা সামনের সমাধান পেয়েছি, আমি আশা করি এটি আপনার জন্যও করবে
<ListBox ItemsSource="{Items}">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Focusable" Value="False"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
Focusable = "False"
!
<Setter Property="IsHitTestVisible" Value="False" />
আপনি একটি এর ItemsControl
পরিবর্তে একটি ব্যবহার করে স্যুইচ করতে পারেন ListBox
। একটি ItemsControl
নির্বাচনের ধারণা নেই, তাই বন্ধ করার মতো কিছুই নেই।
ItemTemplate
।
বিবেচনা করার মতো আর একটি বিকল্প হ'ল তালিকাবক্সআইটেমগুলি অক্ষম করা। নিম্নলিখিত স্নিপেটে যেমন দেখানো হয়েছে আইটেমকন্টেইনার স্টাইল সেট করে এটি করা যেতে পারে।
<ListBox ItemsSource="{Binding YourCollection}">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsEnabled" Value="False" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
আপনি যদি পাঠ্যটি ধূসর হতে না চান তবে নীচের কীটি দিয়ে শৈলীর সংস্থানগুলিতে ব্রাশ যুক্ত করে অক্ষম রঙ নির্দিষ্ট করতে পারেন: {x: স্থিতিশীল সিস্টেমল্যান্ড. গ্রেটেক্সট ব্রাশকি}} অন্য সমাধান হ'ল তালিকাবক্স আইটেম নিয়ন্ত্রণ টেম্পলেটটিকে ওভাররাইড করা।
এটি কাজ করবে, যদি আইটেমসন্ট্রোলের পরিবর্তে আমার তালিকার বাক্স ব্যবহার করার প্রয়োজন হয় তবে আমি কেবল আইটেমগুলি প্রদর্শন করছি যা নির্বাচনযোগ্য নয়, আমি ব্যবহার করি:
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsHitTestVisible" Value="False" />
</Style>
</ListBox.ItemContainerStyle>
এখানে বেশ ভাল উত্তর, কিন্তু আমি কিছুটা আলাদা জন্য সন্ধান করছিলাম: আমি নির্বাচন চাই, তবে এটি চাই না (বা অন্য কোনও ক্ষেত্রে প্রদর্শিত হবে)।
উপরের সমাধানগুলি আমার পক্ষে (সম্পূর্ণরূপে) কাজ করে না, তাই আমি অন্য কিছু করেছি: আমি আমার তালিকাবক্সের জন্য একটি নতুন শৈলী ব্যবহার করেছি, যা টেমপ্লেটগুলিকে পুরোপুরি নতুনভাবে সংজ্ঞায়িত করে:
<Style x:Key="PlainListBoxStyle" TargetType="ListBox">
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBox}">
<ItemsPresenter/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
এটি দিয়ে আপনি সহজেই নিজের পছন্দটি হাইলাইট করে যুক্ত করতে পারেন বা আপনি যদি কিছু চান না তবে এটিকে ছেড়ে যান।
যদিও @ ড্রু নোকসের উত্তরটি বেশিরভাগ ক্ষেত্রেই দ্রুত সমাধান হ'ল এক্স: স্ট্যাটিক ব্রাশগুলি সেট করার সাথে কিছুটা ত্রুটি দেখা দেয়।
আপনি যখন x: স্ট্যাটিক ব্রাশগুলি সেট করবেন সেট করার পরে তালিকার আইটেমের মধ্যে থাকা সমস্ত বাচ্চাদের নিয়ন্ত্রণ এই স্টাইলের অধিকারী হবে।
এর অর্থ এই যে, এটি তালিকার বাক্স আইটেমটির হাইলাইটিং নিষ্ক্রিয় করার জন্য কাজ করবে, তবে এটি শিশু নিয়ন্ত্রণের জন্য অনাকাঙ্ক্ষিত প্রভাবের কারণ হতে পারে।
উদাহরণস্বরূপ, যদি আপনার তালিকাবক্সআইটেমের মধ্যে একটি কম্বোবক্স থাকে তবে এটি কম্বোবক্সের মধ্যে হাইলাইট করার চেয়ে মাউসটিকে অক্ষম করবে।
পরিবর্তে, এই স্ট্যাকওভারফ্লো থ্রেডে উল্লিখিত সমাধান হিসাবে আচ্ছাদিত হিসাবে নির্বাচিত, নির্বাচিত এবং মাউসওভার ইভেন্টগুলির জন্য ভিজ্যুয়াল স্টেটগুলি সেট করার বিষয়ে বিবেচনা করুন: শিশুদের নিয়ন্ত্রণ নয়, তালিকাবক্সআইটেম থেকে নিয়ন্ত্রণ হাইলাইট সরান ।
-Frinny
আমি আরও একটি সমাধান প্রস্তাব। কেবল পুনরায় টেমপ্লেট এর ListBoxItem
চেয়ে বেশি কিছু নয় ContentPresenter
, ...
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
আমার এই পদ্ধতির জন্য কারণগুলি নিম্নরূপ:
আমার ক্ষেত্রে, আমি আমার সামগ্রীর সাথে ব্যবহারকারীর ইন্টারঅ্যাকশনটি অক্ষম করতে চাই না ListBoxItems
তাই সেট করার সমাধানটি আমার পক্ষে কার্যকর IsEnabled
হবে না।
ListBoxItem
রঙ-সম্পর্কিত বৈশিষ্ট্যগুলিকে ওভাররাইড করে পুনরায় স্টাইল করার চেষ্টা করে এমন অন্যান্য সমাধান কেবল সেই উদাহরণগুলির জন্য কাজ করে যেখানে আপনি নিশ্চিত হন যে টেমপ্লেটটি সেই বৈশিষ্ট্যগুলি ব্যবহার করে। এটি ডিফল্ট শৈলীর জন্য দুর্দান্ত, তবে কাস্টম শৈলীর সাথে বিরতি।
যে সমাধানগুলি একটি স্ট্যান্ডার্ডের তুলনায় সম্পূর্ণ ভিন্ন চেহারা রয়েছে এবং ভার্চুয়ালাইজেশন সমর্থন করে না, এর অর্থ সমাধানগুলি ItemsControl
আরও অনেকগুলি বিষয় ভেঙে দেয়, এর অর্থ আপনাকে যাহাই হউক না কেন পুনরায় টেমপ্লেট করতে হবে ।ItemsControl
ListBox
ItemsPanel
উপরেরগুলি এর ডিফল্ট চেহারা পরিবর্তন করে না ListBox
, এর জন্য ডেটা টেম্পলেটগুলিতে আইটেমগুলি অক্ষম করে না ListBox
, ডিফল্টরূপে ভার্চুয়ালাইজেশন সমর্থন করে এবং আপনার অ্যাপ্লিকেশনটিতে যে স্টাইলগুলি ব্যবহৃত হতে পারে বা না ব্যবহৃত হতে পারে তার স্বাধীনভাবে কাজ করে। এটি KISS নীতি।
দ্রষ্টব্য: এই সমাধানটি কীবোর্ড নেভিগেশন বা ডান ক্লিকের মাধ্যমে নির্বাচনটি অক্ষম করে না (উদাহরণস্বরূপ, স্থান কী দ্বারা অনুসরণ করা তীর কীগুলি)
পূর্ববর্তী সমস্ত উত্তরগুলি হয় পুরোপুরি নির্বাচন করার ক্ষমতাটি সরিয়ে দেয় (রানটাইমটিতে স্যুইচিং নেই) বা ভিজ্যুয়াল এফেক্টটি সরিয়ে ফেলবে, তবে নির্বাচনটি নয়।
তবে আপনি যদি কোড দ্বারা নির্বাচনটি নির্বাচন এবং নির্বাচন করতে সক্ষম হতে চান তবে ব্যবহারকারী ইনপুট দ্বারা নয়? পুরো লিস্টবক্সটি অক্ষম না করার সময় আপনি কি ব্যবহারকারীর নির্বাচন "হিমায়িত" করতে চান?
সমাধানটি হ'ল সম্পূর্ণ আইটেমস কনটেন্টপ্যাম্পলেটটি এমন একটি বোতামে গুটিয়ে রাখবে যাতে কোনও ভিজ্যুয়াল ক্রোম নেই। বোতামের আকার অবশ্যই আইটেমের আকারের সমান হতে হবে, সুতরাং এটি পুরোপুরি coveredাকা থাকবে। এবার বোতামটির ইসএনবলড-প্রপার্টি ব্যবহার করুন:
আইটেমের নির্বাচন-অবস্থা "স্থির" করতে বোতামটি সক্ষম করুন। এটি কাজ করে কারণ সক্ষম বোতামটি সমস্ত মাউস ইভেন্টগুলি তালিকার আইটেম-ইভেন্টহ্যান্ডলারের কাছে বুদবুদ দেওয়ার আগেই খায়। আপনার আইটেমডেটা টেম্পলেটটি এখনও মাউসএভেন্টস গ্রহণ করবে কারণ এটি বোতামগুলির সামগ্রীর অংশ।
ক্লিক করে নির্বাচন পরিবর্তন করতে সক্ষম করতে বোতামটি অক্ষম করুন।
<Style x:Key="LedCT" TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Button IsEnabled="{Binding IsSelectable, Converter={StaticResource BoolOppositeConverter}}" Template="{DynamicResource InvisibleButton}">
<ContentPresenter />
</Button>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<ControlTemplate x:Key="InvisibleButton" TargetType="{x:Type Button}">
<ContentPresenter/>
</ControlTemplate>
dartrax
হতে পারে আপনার আইটেমকন্ট্রোলের কেবলমাত্র কার্যকারিতা প্রয়োজন? এটি নির্বাচনের অনুমতি দেয় না:
<ItemsControl ItemsSource="{Binding Prop1}" ItemTemplate="{StaticResource DataItemsTemplate}" />
উদাহরণস্বরূপ উইন্ডোজ ফোনে কাজ করা একটি সাধারণ ফিক্সটি নির্বাচিত আইটেমটি বাতিল করতে বাছাইয়ের সেটিংসে রয়েছে:
<ListBox SelectionChanged="ListBox_SelectionChanged">
এবং পিছনে কোডে:
private void ListBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
(sender as ListBox).SelectedItem = null;
}
আমি একটি সঠিক উপায় খুঁজে পেয়েছি।
লাস্টবক্স ইশহিটটেষ্টকে ভুসিলে সেট করুন যাতে ব্যবহারকারী মাউস বাড়াতে বা স্ক্রোল করতে বা স্ক্রোল করতে না পারে।
প্রাকদর্শনগটকিবোর্ডফোকাস ক্যাপচার করুন e হ্যান্ডলড = সত্য যাতে ব্যবহারকারী কীবোর্ড ট্যাব, তীর আপ, তীর নীচে বাছাই করতে পারেন item
এই উপায় সুবিধা:
xmal
<ListBox Name="StudentsListBox" ItemsSource="{Binding Students}" ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.HorizontalScrollBarVisibility="Disabled" BorderThickness="0" Background="Transparent" IsHitTestVisible="False" PreviewGotKeyboardFocus="StudentsListBox_PreviewGotKeyboardFocus">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Padding" Value="0"/>
<Setter Property="Margin" Value="0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border x:Name="Bd">
<ContentPresenter/>
</Border>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Selector.IsSelectionActive" Value="False" />
<Condition Property="IsSelected" Value="True" />
</MultiTrigger.Conditions>
<Setter TargetName="Bd" Property="Background" Value="Yellow" />
<Setter TargetName="Bd" Property="BorderBrush" Value="Transparent" />
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="0,0,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Name="GradeBlock" Text="{Binding Grade}" FontSize="12" Margin="0,0,5,0"/>
<TextBlock Grid.Column="1" Name="NameTextBlock" Text="{Binding Name}" FontSize="12" TextWrapping="Wrap"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ListBox>
কোড
private void StudentsListBox_PreviewGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
e.Handled = true;
}
আমার জন্য সর্বোত্তম সমাধানটি হ'ল:
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Focusable" Value="True"/>
<Setter Property="IsHitTestVisible" Value="False" />
</Style>
</ListBox.ItemContainerStyle>
ইসএনেবলড = মিথ্যা
আপনার তালিকা বাক্সে / ড্রপডাউনটিতে এক বা একাধিক বিকল্প অক্ষম করতে, আপনি নীচের মত "অক্ষম" বৈশিষ্ট্য যুক্ত করতে পারেন। এটি ব্যবহারকারীকে এই বিকল্পটি নির্বাচন করতে বাধা দেয় এবং এটি ধূসর রঙের ওভারলে পায়।
ListItem item = new ListItem(yourvalue, yourkey);
item.Attributes.Add("disabled","disabled");
lb1.Items.Add(item);