ডাব্লুপিএফ তালিকাভুক্ত নির্বাচনটি বন্ধ করে দেয়


119

আমার কাছে একটি সাধারণ ডাব্লুপিএফ তালিকাভিউ এবং একটি সাধারণ প্রশ্ন রয়েছে:

নির্বাচনটি বন্ধ করা কি সম্ভব, তাই যখন ব্যবহারকারী সারি ক্লিক করেন, সারিটি হাইলাইট করা হয় না?

তালিকা দেখুন

আমি ক্লিক করব যখন সারি 1 টি সারি 0 এর মতো দেখতে চাই।

সম্ভবত সম্পর্কিত: আমি কি হোভার / নির্বাচনের চেহারাটি স্টাইল করতে পারি? যেমন। কাস্টম কঠিন রঙের সাথে নীল গ্রেডিয়েন্ট হোভার লুক (লাইন 3) প্রতিস্থাপন করতে। আমি খুঁজে পেয়েছি এই এবং এই দুর্ভাগ্যবশত সাহায্য নয়।

(তালিকাগুলি ব্যবহার না করে একই অর্জনটি গ্রহণযোগ্যও I'd

লিস্টভিউয়ের জন্য এক্সএএমএল হ'ল:

<ListView Height="280" Name="listView">
    <ListView.Resources>
        <!-- attempt to override selection color -->
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightColorKey}"
                         Color="Green" />
    </ListView.Resources>
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
                <!-- more columns -->
            </GridView.Columns>
        </GridView>
     </ListView.View>
</ListView>

আমি এর আগে কখনও ডাব্লুপিএফ-তে একটি লিস্টভিউ ব্যবহার করি নি, তবে আমি নিশ্চিত যে এখানে কিছু প্রকারের ইসনেবল সম্পত্তি রয়েছে যা যদি মিথ্যা হিসাবে সেট করা থাকে তবে পুরো নিয়ন্ত্রণটি অক্ষম করে দেয় এবং সম্ভবত আপনি যা করতে পারেন তা অর্জন করতে পারে তবে আমি আছি 100% নিশ্চিত না।
জেমস ম্যাককনেল

হাই, হ্যাঁ একটি ইসএনএবলড সম্পত্তি রয়েছে যা পুরো লিস্টভিউটি অক্ষম করতে পারে। আমার তালিকাভিউটি স্বাভাবিকভাবে কাজ করার জন্য প্রয়োজন তবে কেবল নির্বাচনটি প্রদর্শন করবেন না।
মার্টিন কোনিসেক

উত্তর:


135

সরলতম পদ্ধতিতে আইটেমের নির্বাচন সম্পূর্ণরূপে অক্ষম করতে মার্টিন কোনিসেকের মন্তব্য:

<ListView>
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="Focusable" Value="false"/>
        </Style>
    </ListView.ItemContainerStyle>
    ...
</ListView>

তবে যদি আপনার এখনও তালিকার ভিউ কার্যকারিতা প্রয়োজন যেমন কোনও আইটেম নির্বাচন করতে সক্ষম হচ্ছেন তবে আপনি নির্বাচিত আইটেমটির স্টাইলিংটি দৃশ্যত অক্ষম করতে পারেন:

তালিকার ভিউ আইটেমের কন্ট্রোলটেম্পলেট পরিবর্তন করে কেবল একটি স্টাইল সেট করা (অনেক সহজ) থেকে আপনি এটি বেশ কয়েকটি উপায়ে করতে পারেন । আপনি আইটেমকন্টেইনার স্টাইল ব্যবহার করে তালিকাভিউ আইটেমগুলির জন্য একটি স্টাইল তৈরি করতে পারেন এবং এটি নির্বাচন করা হলে পটভূমি এবং সীমানা ব্রাশটি 'বন্ধ' করতে পারেন।

<ListView>
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Style.Triggers>
                <Trigger Property="IsSelected"
                         Value="True">
                    <Setter Property="Background"
                            Value="{x:Null}" />
                    <Setter Property="BorderBrush"
                            Value="{x:Null}" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListView.ItemContainerStyle>
    ...
</ListView>

এছাড়াও, যদি আইটেমটি নির্বাচন করা হয় যখন আপনি ব্যবহারকারীকে অবহিত করার অন্য কোনও উপায় না করেন (বা কেবল পরীক্ষার জন্য) আপনি মানটি উপস্থাপন করতে একটি কলাম যুক্ত করতে পারেন:

<GridViewColumn Header="IsSelected"
                DisplayMemberBinding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListViewItem}}, Path=IsSelected}" />

2
সম্পর্কিত অংশটি দেখেনি, তবে আপনি ইসমাউস ওভার সম্পত্তি হিসাবে পছন্দ হিসাবে পটভূমি এবং সীমানা সেট করে একই জিনিসটি করতে পারেন।
rmoore

88
আমি এটিকে আরও ভাল সমাধান করেছি - <সেটার সম্পত্তি = "ফোকাসযোগ্য" মান = "মিথ্যা" /> সারিটি নির্বাচন করা সম্পূর্ণরূপে অক্ষম করে।
মার্টিন কোনিসেক

8
আহ্, আমি ভেবেছিলাম আপনি কেবলমাত্র দৃষ্টিভঙ্গি বাছাই বন্ধ করবেন। আপনি যদি এগুলিকে মোটেও নির্বাচিত না করতে চান তবে আপনি আইটেমস কন্ট্রোলটি ব্যবহার করে দেখে নিতে পারেন (যেহেতু আপনি নির্বাচিত আইটেমগুলি যদি মনোযোগযোগ্য না হয় তবে কোডের মাধ্যমে সেট করতে পারেন), যদিও গ্রিডটি আপনাকে দেখতে পাবেন 'এর মতো কিছু করতে হবে: manicprogrammer.com/cs/blogs/… এছাড়াও, আপনি এখনও না থাকলে আপনি ডাব্লুপিএফ আনল্যাশড বইটি চেক করতে চাইতে পারেন, কারণ এটি ডাব্লুপিএফ এবং এক্সএএমএল-এর একটি দুর্দান্ত ভূমিকা সরবরাহ করে।
rmoore

2
@ মার্টিনকোনিসেক আমি জানি এটি একটি পুরানো পোস্ট তবে আপনার উচ্চ রেট করা মন্তব্যটির উত্তর হওয়া উচিত;)
WiiMaxx

1
@ মার্টিনকোনিসেক আমাকে যুক্ত করতে হয়েছিল BasedOn="{StaticResource {x:Type ListViewItem}}"যাতে এটি আমার গ্রিডের বাকী অংশগুলি ওভাররাইড না করে, তবে আমিও মনে করি আপনার মন্তব্যটি গৃহীত উত্তরটি করা উচিত
জাম্পিংজেজ্জা

31

মুরের উত্তর কার্যকর হয় না, এবং পৃষ্ঠাটি এখানে:

একটি তালিকাবক্সে আইটেমগুলির জন্য নির্বাচন রঙ, সামগ্রী প্রান্তিককরণ এবং পটভূমি রঙ উল্লেখ করা হচ্ছে

কেন এটি কাজ করতে পারে না তা ব্যাখ্যা করে।

যদি আপনার তালিকার ভিউটিতে কেবলমাত্র মূল পাঠ্য থাকে তবে সমস্যা সমাধানের সহজতম উপায় হ'ল স্বচ্ছ ব্রাশ ব্যবহার।

<Window.Resources>
  <Style TargetType="{x:Type ListViewItem}">
    <Style.Resources>
      <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#00000000"/>
      <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="#00000000"/>
    </Style.Resources>
  </Style>
</Window.Resources>

যদি তালিকা ভিউয়ের কোষগুলি কম্বোবক্সের মতো নিয়ন্ত্রণ ধরে থাকে তবে এটি অনাকাঙ্ক্ষিত ফলাফল আনবে, কারণ এটি তাদের রঙ পরিবর্তন করে। এই সমস্যাটি সমাধান করার জন্য আপনাকে অবশ্যই নিয়ন্ত্রণের টেম্পলেটটিকে নতুন করে সংজ্ঞায়িত করতে হবে।

  <Window.Resources>
    <Style TargetType="{x:Type ListViewItem}">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="{x:Type ListViewItem}">
            <Border SnapsToDevicePixels="True" 
                    x:Name="Bd" 
                    Background="{TemplateBinding Background}" 
                    BorderBrush="{TemplateBinding BorderBrush}" 
                    BorderThickness="{TemplateBinding BorderThickness}" 
                    Padding="{TemplateBinding Padding}">
              <GridViewRowPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
                                    VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
                                    Columns="{TemplateBinding GridView.ColumnCollection}" 
                                    Content="{TemplateBinding Content}"/>
            </Border>
            <ControlTemplate.Triggers>
              <Trigger Property="IsEnabled" 
                       Value="False">
                <Setter Property="Foreground" 
                        Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
              </Trigger>
            </ControlTemplate.Triggers>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </Window.Resources>

14
এটি আমার তালিকাভিউতে আমার সমস্ত আইটেম অদৃশ্য হয়ে যায়
চক সেভেজ

18

ফোকাসযোগ্যকে মিথ্যাতে সেট করতে প্রতিটি তালিকাভিউ আইটেমের স্টাইলটি সেট করুন।

<ListView ItemsSource="{Binding Test}" >
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Setter Property="Focusable" Value="False"/>
        </Style>
    </ListView.ItemContainerStyle>
</ListView>

4
সহজ এবং দক্ষ। এবং এটি আসলে যা করা হয় তা করে: এটি কেবল এটি লুকিয়ে রাখার পরিবর্তে নির্বাচনটি বন্ধ করে দেয়। এটি সেরা উত্তর।
ফুমিডু

13

মিশ্রণ থেকে তালিকাভিউ আইটেমের জন্য এখানে ডিফল্ট টেম্পলেট রয়েছে:

ডিফল্ট তালিকাভিউ আইটেম টেম্পলেট:

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListViewItem}">
                    <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsSelected" Value="true">
                            <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                        </Trigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsSelected" Value="true"/>
                                <Condition Property="Selector.IsSelectionActive" Value="false"/>
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}"/>
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}}"/>
                        </MultiTrigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>

ডিফল্ট টেম্পলেটটি প্রতিস্থাপন করতে কেবল আপনার শৈলীতে নীচের কোডটি যুক্ত করে কেবল ইসসলেক্টড ট্রিগার এবং ইসসলেক্টেড / আইসলেকশনএ্যাকটিভ মাল্টি ট্রাইগারটি সরিয়ে ফেলুন এবং নির্বাচিত হওয়ার পরে কোনও ভিজ্যুয়াল পরিবর্তন হবে না।

আইসলেক্টেড প্রোপার্টিটির ভিজ্যুয়াল পরিবর্তনগুলি বন্ধ করার সমাধান:

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListViewItem}">
                <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

12

সবচেয়ে সহজ উপায় আমি খুঁজে পেয়েছি:

<Setter Property="Focusable" Value="false"/>

4
@ মুটেক্স এটি কাজ করে - আপনাকে এটি প্রয়োগ করতে হবে ListView.ItemContainerStyleযদিও!
Andreas Niedermair

8

উপরের সমাধানটিতে আরও ... আমি মাউসওভার হাইলাইটগুলি নির্বাচনের পরে কাজ চালিয়ে যাওয়ার অনুমতি দেওয়ার জন্য একটি মাল্টিট্রিগার ব্যবহার করব যেমন আপনার তালিকাভিউ আইটেমের স্টাইলটি হ'ল:

        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Style.Triggers>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsSelected" Value="True" />
                            <Condition Property="IsMouseOver" Value="False" />
                        </MultiTrigger.Conditions>
                        <MultiTrigger.Setters>
                            <Setter Property="Background" Value="{x:Null}" />
                            <Setter Property="BorderBrush" Value="{x:Null}" />
                        </MultiTrigger.Setters>
                    </MultiTrigger>
                </Style.Triggers>
            </Style>
        </ListView.ItemContainerStyle>

6

ঠিক আছে, গেমটি থেকে একটু দেরীতে, তবে এর সমাধানগুলির কোনওটিই আমি যা করার চেষ্টা করছিলাম তা পুরোপুরি করেনি। এই সমাধানগুলির কয়েকটি সমস্যা আছে

  1. তালিকাভিউ আইটেমটি অক্ষম করুন, যা স্টাইলগুলিকে স্ক্রু করে দেয় এবং সমস্ত বাচ্চাদের নিয়ন্ত্রণ অক্ষম করে
  2. হিট-টেস্ট স্ট্যাক থেকে সরান, অর্থাত্ শিশুরা নিয়ন্ত্রণগুলি কখনই মাউস-ওভার পায় না বা ক্লিক করে
  3. এটি ফোকাসযোগ্য নয়, এই সরল প্লেইন আমার পক্ষে কাজ করে না?

আমি গ্রুপিং শিরোনামগুলির সাথে একটি তালিকাভিউ চেয়েছিলাম এবং প্রতিটি তালিকাভিউ আইটেমটি কেবল বাছাই ছাড়াই বা হোভার ছাড়াই 'তথ্যযুক্ত' হওয়া উচিত, তবে তালিকাভিউ আইটেমটিতে একটি বোতাম রয়েছে যে আমি ক্লিক করতে সক্ষম হতে এবং হোভার-ওভার করতে চাই।

সুতরাং, আমি যা চাই তা হল তালিকার ভিউ আইটেমটি একেবারে তালিকাভিউ আইটেম না হওয়া, সুতরাং, আমি তালিকাভিউ আইটেমের কন্ট্রোলটিপ্লেট চালিয়ে এটিকে কেবল একটি সাধারণ কন্টেন্টকন্ট্রোল করে তুলেছি।

<ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <ContentControl Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}"/>
                </ControlTemplate>
            </Setter.Value>
         </Setter>
     </Style>
</ListView.ItemContainerStyle>

5

তালিকা দেখার বৈশিষ্ট্যগুলির মধ্যে একটি IsHitTestVisible। এটি চেক করুন।


সরল এবং কার্যকর, আমার তালিকা সমাধানের জন্য স্ক্রোলভিউয়ারের মোড়ানো অংশটিও সমাধান করুন।
ব্রায়ান এনজি

1
আমি তালিকার আইটেমটিপ্লেটের ভিতরে বোতামের টেম্পলেট পেয়েছি। যদি বাছাই IsHitTestVisibleকরে বাটনটি ক্লিক করা যায় না। এটি এর মতো কাজ করেIsEnabled = false;
লুই

1

এটি অন্যদের জন্য যারা নিম্নলিখিত প্রয়োজনীয়তার মুখোমুখি হতে পারেন:

  1. স্ট্যান্ডার্ড হাইলাইটের রঙ পরিবর্তন না করে "নির্বাচিত" (যেমন কোনও ধরণের আকার ব্যবহার করুন) এর ভিজ্যুয়াল ইঙ্গিতটি সম্পূর্ণরূপে প্রতিস্থাপন করুন
  2. আপনার মডেলের অন্যান্য ভিজ্যুয়াল উপস্থাপনার সাথে এই নির্বাচিত ইঙ্গিতটি ডেটা টেম্পলেটটিতে অন্তর্ভুক্ত করুন, তবে,
  3. আপনার মডেল শ্রেণিতে একটি "ইসসলেক্ট আইটেম" সম্পত্তি যুক্ত করতে চান না এবং সমস্ত মডেল অবজেক্টগুলিতে সেই সম্পত্তিটি ম্যানুয়ালি ব্যবহারের বোঝা হয়ে পড়তে হবে না।
  4. তালিকাভিউতে আইটেমগুলি নির্বাচনযোগ্য হতে হবে
  5. ইসমাউসওভারের চাক্ষুষ উপস্থাপনাটি প্রতিস্থাপন করতে চাই

আপনি যদি আমার মতো হন (.NET 4.5 এর সাথে ডাব্লুপিএফ ব্যবহার করে) এবং দেখতে পেয়েছেন যে স্টাইলের সাথে জড়িত সমাধানগুলি কেবল কার্যকরভাবে কাজ করে না, আমার সমাধানটি এখানে:

তালিকার ভিউ আইটেমের কন্ট্রোলটেম্পলেটটি একটি স্টাইলে প্রতিস্থাপন করুন:

<ListView ItemsSource="{Binding MyStrings}" ItemTemplate="{StaticResource dtStrings}">
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListViewItem">
                            <ContentPresenter/>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListView.ItemContainerStyle>
    </ListView>

..আর ডেটা টেম্পলেট:

<DataTemplate x:Key="dtStrings">
        <Border Background="LightCoral" Width="80" Height="24" Margin="1">
            <Grid >
                <Border Grid.ColumnSpan="2" Background="#88FF0000" Visibility="{Binding RelativeSource={RelativeSource AncestorType=ListViewItem}, Path=IsMouseOver, Converter={StaticResource conBoolToVisibilityTrueIsVisibleFalseIsCollapsed}}"/>
                <Rectangle Grid.Column="0" Fill="Lime" Width="10" HorizontalAlignment="Left" Visibility="{Binding RelativeSource={RelativeSource AncestorType=ListViewItem}, Path=IsSelected, Converter={StaticResource conBoolToVisibilityTrueIsVisibleFalseIsCollapsed}}" />
                <TextBlock Grid.Column="1" Text="{Binding}" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White" />
            </Grid>
        </Border>
    </DataTemplate>

রানটাইমের সময়ে এর ফলাফল (আইটেম 'বি' নির্বাচন করা হয়েছে, আইটেম 'ডি' এর মাউস শেষ হয়েছে):

তালিকাভিউ উপস্থিতি


1

কোডটি বেলো ব্যবহার করুন:

   <ListView.ItemContainerStyle>
          <Style TargetType="{x:Type ListViewItem}">
           <Setter Property="Background" Value="Transparent`enter code here`" />
             <Setter Property="Template">
               <Setter.Value>
                 <ControlTemplate TargetType="{x:Type ListViewItem}">
                   <ContentPresenter />
                 </ControlTemplate>
               </Setter.Value>
             </Setter>
          </Style>
   </ListView.ItemContainerStyle>

0

কোডের নীচে তালিকাভিউ আইটেম সারি নির্বাচনটি অক্ষম করে এবং প্যাডিং, মার্জিন ইত্যাদি যুক্ত করতে দেয় allows

<ListView.ItemContainerStyle>                                                                              
   <Style TargetType="ListViewItem">                                                                                      
       <Setter Property="Template">                                                                                            
         <Setter.Value>                                                                                             
           <ControlTemplate TargetType="{x:Type ListViewItem}">                                                                                                    
              <ListViewItem Padding="0" Margin="0">                                                                                                        
                  <ContentPresenter />
              </ListViewItem>
           </ControlTemplate>                                                          
         </Setter.Value>                                                                                       
         </Setter>
      </Style>                                                                      
  </ListView.ItemContainerStyle> 

0

কোডের নীচে তালিকাভিউ আইটেমটিতে ফোকাস অক্ষম করুন

<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
    <Setter Property="Background" Value="Transparent" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListViewItem}">
                <ContentPresenter />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.