none
ListViewの選択項目を選択不可にしたい RRS feed

  • 質問

  • Visual C# 2019
    UWP

    UWPで画面を作成していて、下記のコードのようにリストボックスを作成しました。
    ここで、リストボックス内には表示されているが、特定の項目はグレーアウトされて選択することができずイベントも発生しない
    ということがやりたかったのですが、実現することができませんでした。

    StackPanelに対してIsTapEnabled="False"としてもTappedイベントが走行してしまうし、
    ListViewで選択されたこと自体を拒否するような動作もできないようですし、
    どうすると実現できるのでしょうか?


                <ListView ItemsSource="{Binding RoomItems}" Grid.Row="1" x:Name="speakerListView" VerticalAlignment="Stretch">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <Grid>
                                <StackPanel Grid.Column="1" Orientation="Horizontal" Tapped="StackPanel_Tapped">
                                    <FontIcon Grid.Column="0" FontFamily="Segoe MDL2 Assets" Glyph="&#xE94B;" Foreground="Green" FontWeight="Bold" FontSize="30" />
                                    <TextBlock Text="{Binding RoomNo}"
                                           FontSize="30"
                                           />
                                    <TextBlock Text=":" FontSize="30" IsTapEnabled="False" />
                                    <TextBlock Text="{Binding Resident}"
                                           FontSize="30"
                                           />
                                </StackPanel>
                            </Grid>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>


    2020年1月17日 10:27

回答

  • takiruさん、こんにちは。フォーラムオペレーターのクモです。
    ご返信いただきありがとうございます。

    ListViewItemのListViewの選択機能をdisableにしたいだけの場合は、
    SelectionModeプロパティをNoneに直接設定して、ListViewの項目選択をdisableにすることができます。

    他に質問がある場合は、教えてください。

    どうぞよろしくお願いいたします。 

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    • 回答としてマーク takiru 2020年2月21日 5:36
    2020年2月10日 7:34
    モデレータ

すべての返信

  • ListViewItemのIsEnabledプロパティを操作してみる

    <Page
        x:Class="App1.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:App1"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition/>
            </Grid.RowDefinitions>
    
            <TextBlock Text="{Binding ElementName=speakerListView,Path=SelectedIndex}" 
                       FontSize="30"/>
    
            <ListView ItemsSource="{Binding RoomItems}" Grid.Row="1" x:Name="speakerListView" VerticalAlignment="Stretch">
    
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <Grid Loaded="Grid_Loaded">
                            <StackPanel Grid.Column="1" Orientation="Horizontal" Tapped="StackPanel_Tapped">
    
                                <FontIcon Grid.Column="0" FontFamily="Segoe MDL2 Assets" Glyph="&#xE94B;" Foreground="Green" FontWeight="Bold" FontSize="30" />
                                <TextBlock Text="{Binding RoomNo}"
                                           FontSize="30"
                                           />
                                <TextBlock Text=":" FontSize="30" IsTapEnabled="False" />
                                <TextBlock Text="{Binding Resident}"
                                           FontSize="30"
                                           />
                            </StackPanel>
                        </Grid>
                    </DataTemplate>
                </ListView.ItemTemplate>
    
                <ListBoxItem />
            </ListView>
        </Grid>
    </Page>
    using System;
    using System.Collections.Generic;
    using Windows.Foundation;
    using Windows.UI.ViewManagement;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Controls.Primitives;
    using Windows.UI.Xaml.Data;
    using Windows.UI.Xaml.Input;
    
    namespace App1
    {
        public sealed partial class MainPage : Page
        {
            public MainPage()
            {
                ApplicationView.PreferredLaunchViewSize
                  = new Size { Height = 300, Width = 300 };
                ApplicationView.PreferredLaunchWindowingMode
                  = ApplicationViewWindowingMode.PreferredLaunchViewSize;
    
                this.InitializeComponent();
    
                this.DataContext = new Data();
            }
    
            private void StackPanel_Tapped(object sender, TappedRoutedEventArgs e)
            {
    
            }
    
            private void Grid_Loaded(object sender, RoutedEventArgs e)
            {
                DependencyObject d = (DependencyObject)sender;
                while (d != null)
                {
                    d = Windows.UI.Xaml.Media.VisualTreeHelper.GetParent(d);
                    if (d is ListViewItem)
                    {
                        Binding bnd = new Binding();
                        bnd.Source = sender;
                        bnd.Path = new PropertyPath("DataContext.IsEnabled");
    
                        ListViewItem lvi = (ListViewItem)d;
                        lvi.SetBinding(ListBoxItem.IsEnabledProperty, bnd);
                        break;
                    }
                }
            }
        }
    
    
        class Data
        {
            public List<RoomItem> RoomItems { get; set; } = new List<RoomItem>()
            {
                new RoomItem(){ RoomNo="1", Resident="A",IsEnabled=true },
                new RoomItem(){ RoomNo="2", Resident="B" ,IsEnabled=false},
                new RoomItem(){ RoomNo="3", Resident="C" ,IsEnabled=true},
            };
        }
    
        class RoomItem
        {
            public string RoomNo { get; set; }
            public string Resident { get; set; }
    
            public bool IsEnabled { get; set; }
        }
    }


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2020年1月17日 13:34
    2020年1月17日 13:17
  • できました!ありがとうございます。

    ちなみに説明不足でしたが、IsEnabled=false時、ListViewItemの背景色もグレーアウトすることは可能でしょうか?

    2020年1月20日 1:10
  • ListViewItemのControlTemplateを書き換えてみる

    <Page
        x:Class="App1.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:App1"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Page.Resources>
    
            <Style x:Key="ListViewItemRevealStyle" TargetType="ListViewItem">
                <Setter Property="FontFamily" Value="{ThemeResource ContentControlThemeFontFamily}"/>
                <Setter Property="FontSize" Value="{ThemeResource ControlContentThemeFontSize}"/>
                <Setter Property="Background" Value="{ThemeResource ListViewItemBackground}"/>
                <Setter Property="Foreground" Value="{ThemeResource ListViewItemForeground}"/>
                <Setter Property="TabNavigation" Value="Local"/>
                <Setter Property="IsHoldingEnabled" Value="True"/>
                <Setter Property="Padding" Value="12,0,12,0"/>
                <Setter Property="HorizontalContentAlignment" Value="Left"/>
                <Setter Property="VerticalContentAlignment" Value="Center"/>
                <Setter Property="MinWidth" Value="{ThemeResource ListViewItemMinWidth}"/>
                <Setter Property="MinHeight" Value="{ThemeResource ListViewItemMinHeight}"/>
                <Setter Property="AllowDrop" Value="False"/>
                <Setter Property="UseSystemFocusVisuals" Value="{StaticResource UseSystemFocusVisuals}"/>
                <Setter Property="FocusVisualMargin" Value="0"/>
    
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListViewItem">
                            <ListViewItemPresenter x:Name="Root" CheckBrush="{ThemeResource ListViewItemCheckBrush}" 
                                                   ContentMargin="{TemplateBinding Padding}" 
                                                   CheckBoxBrush="{ThemeResource ListViewItemCheckBoxBrush}" 
                                                   ContentTransitions="{TemplateBinding ContentTransitions}" 
                                                   CheckMode="{ThemeResource ListViewItemCheckMode}" 
                                                   DragOpacity="{ThemeResource ListViewItemDragThemeOpacity}" 
                                                   DisabledOpacity="{ThemeResource ListViewItemDisabledThemeOpacity}" 
                                                   DragBackground="{ThemeResource ListViewItemDragBackground}" 
                                                   DragForeground="{ThemeResource ListViewItemDragForeground}" 
                                                   FocusBorderBrush="{ThemeResource ListViewItemFocusBorderBrush}" 
                                                   FocusVisualMargin="{TemplateBinding FocusVisualMargin}" 
                                                   FocusSecondaryBorderBrush="{ThemeResource ListViewItemFocusSecondaryBorderBrush}" 
                                                   HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                                   Control.IsTemplateFocusTarget="True" 
                                                   PressedBackground="{ThemeResource ListViewItemBackgroundPressed}" 
                                                   PlaceholderBackground="{ThemeResource ListViewItemPlaceholderBackground}" 
                                                   PointerOverForeground="{ThemeResource ListViewItemForegroundPointerOver}" 
                                                   PointerOverBackground="{ThemeResource ListViewItemBackgroundPointerOver}" 
                                                   RevealBorderThickness="{ThemeResource ListViewItemRevealBorderThemeThickness}" 
                                                   ReorderHintOffset="{ThemeResource ListViewItemReorderHintThemeOffset}" 
                                                   RevealBorderBrush="{ThemeResource ListViewItemRevealBorderBrush}" 
                                                   RevealBackground="{ThemeResource ListViewItemRevealBackground}"
                                                   SelectedForeground="{ThemeResource ListViewItemForegroundSelected}" 
                                                   SelectionCheckMarkVisualEnabled="{ThemeResource ListViewItemSelectionCheckMarkVisualEnabled}" 
                                                   SelectedBackground="{ThemeResource ListViewItemBackgroundSelected}" 
                                                   SelectedPressedBackground="{ThemeResource ListViewItemBackgroundSelectedPressed}" 
                                                   SelectedPointerOverBackground="{ThemeResource ListViewItemBackgroundSelectedPointerOver}" 
                                                   VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}">
                                <VisualStateManager.VisualStateGroups>
                                    <VisualStateGroup x:Name="CommonStates">
                                        <VisualState x:Name="Normal"/>
                                        <VisualState x:Name="Selected"/>
                                        <VisualState x:Name="PointerOver">
                                            <VisualState.Setters>
                                                <Setter Target="Root.(RevealBrush.State)" Value="PointerOver"/>
                                                <Setter Target="Root.RevealBorderBrush" Value="{ThemeResource ListViewItemRevealBorderBrushPointerOver}"/>
                                            </VisualState.Setters>
                                        </VisualState>
                                        <VisualState x:Name="PointerOverSelected">
                                            <VisualState.Setters>
                                                <Setter Target="Root.(RevealBrush.State)" Value="PointerOver"/>
                                                <Setter Target="Root.RevealBorderBrush" Value="{ThemeResource ListViewItemRevealBorderBrushPointerOver}"/>
                                            </VisualState.Setters>
                                        </VisualState>
                                        <VisualState x:Name="PointerOverPressed">
                                            <VisualState.Setters>
                                                <Setter Target="Root.(RevealBrush.State)" Value="Pressed"/>
                                                <Setter Target="Root.RevealBorderBrush" Value="{ThemeResource ListViewItemRevealBorderBrushPressed}"/>
                                            </VisualState.Setters>
                                        </VisualState>
                                        <VisualState x:Name="Pressed">
                                            <VisualState.Setters>
                                                <Setter Target="Root.(RevealBrush.State)" Value="Pressed"/>
                                                <Setter Target="Root.RevealBorderBrush" Value="{ThemeResource ListViewItemRevealBorderBrushPressed}"/>
                                            </VisualState.Setters>
                                        </VisualState>
                                        <VisualState x:Name="PressedSelected">
                                            <VisualState.Setters>
                                                <Setter Target="Root.(RevealBrush.State)" Value="Pressed"/>
                                                <Setter Target="Root.RevealBorderBrush" Value="{ThemeResource ListViewItemRevealBorderBrushPressed}"/>
                                            </VisualState.Setters>
                                        </VisualState>
                                    </VisualStateGroup>
                                    <VisualStateGroup x:Name="DisabledStates">
                                        <VisualState x:Name="Enabled"/>
                                        <VisualState x:Name="Disabled">
                                            <VisualState.Setters>
                                                <Setter Target="Root.RevealBorderThickness" Value="0"/>
                                                
                                                <!-- これ -->
                                                <Setter Target="Root.RevealBackground" Value="Gray" />
                                                
                                            </VisualState.Setters>
                                        </VisualState>
                                    </VisualStateGroup>
                                </VisualStateManager.VisualStateGroups>
                            </ListViewItemPresenter>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
            <Style x:Key="ListViewItemContainerStyle1" BasedOn="{StaticResource ListViewItemRevealStyle}" TargetType="ListViewItem"/>
        </Page.Resources>
    
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition/>
            </Grid.RowDefinitions>
    
            <TextBlock Text="{Binding ElementName=speakerListView,Path=SelectedIndex}" 
                       FontSize="30"/>
    
            <ListView ItemContainerStyle="{StaticResource ListViewItemContainerStyle1}" ItemsSource="{Binding RoomItems}" Grid.Row="1" x:Name="speakerListView" VerticalAlignment="Stretch"
                      HorizontalContentAlignment="Stretch">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <Grid Loaded="Grid_Loaded" >
    
                            <StackPanel Grid.Column="1" Orientation="Horizontal" Tapped="StackPanel_Tapped">
    
                                <FontIcon Grid.Column="0" FontFamily="Segoe MDL2 Assets" Glyph="&#xE94B;" Foreground="Green" FontWeight="Bold" FontSize="30" />
                                <TextBlock Text="{Binding RoomNo}"
                                           FontSize="30"
                                           />
                                <TextBlock Text=":" FontSize="30" IsTapEnabled="False" />
                                <TextBlock Text="{Binding Resident}"
                                           FontSize="30"
                                           />
                            </StackPanel>
                        </Grid>
                    </DataTemplate>
                </ListView.ItemTemplate>
    
            
            </ListView>
        </Grid>
    </Page>
    めんどくさいので、ListViewItemのHorizontalContentAlignmentをStretchにして、ListView.ItemTemplateの背景色を変更したほうが楽です。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2020年1月20日 11:51
  • takiruさん、こんにちは。フォーラムオペレーターのクモです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    本件、gekkaさんより参考になる投稿が寄せられたようでなによりです。

    [回答としてマーク]機能は設定された投稿が後から参照しやすくなりますので、
    同じ問題でお困りの方のためにも参考になった投稿に設定いただけますと幸いです。

    お手数ですが、ご協力の程どうかよろしくお願いいたします。

    引き続きMSDNフォーラムをご利用いただけますようお願い申し上げます。

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2020年1月21日 1:52
    モデレータ
  • ありがとうございます!
    背景色を変えるだけでも全体のスタイルを定義する必要があるようで、結構難儀なんですね。

    ところで最初の質問に戻ってしまいますが、確認していたところ、選択できない動作について
    また解決できない事象があったので助けてください。

    リストボックスの表示領域を超えた範囲、例えばリストボックスは縦5項目の表示領域で、
    項目は10項目あり、縦スクロールによって6~10項目を表示する形にある時に発生します。

    例えば8項目目が選択できないものとした時、教えていただいたGird_Loaded()の実装では
    制御されないようでした。

    何度もすみませんが、どのようにすると実現できるのかご教示ください。

    2020年1月28日 1:11
  • takiruさん、こんにちは。フォーラムオペレーターのクモです。
    ご返信いただきありがとうございます。

    ListViewItemのListViewの選択機能をdisableにしたいだけの場合は、
    SelectionModeプロパティをNoneに直接設定して、ListViewの項目選択をdisableにすることができます。

    他に質問がある場合は、教えてください。

    どうぞよろしくお願いいたします。 

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    • 回答としてマーク takiru 2020年2月21日 5:36
    2020年2月10日 7:34
    モデレータ