none
如何改变ListView选中项的背景色 RRS feed

  • 问题

  • 两个问题不清楚

    1,如何改变ListView选中项的背景色

    2,在ListView的ItemTemplate里放入一个按钮,能否处理这个按钮的事件?

    2012年4月18日 2:21

答案

  • 1. 这种情况,你可以用带的Blend for VS 11 beta 打开一个项目。在Page中加一个ListView, 然后在ListView上右键,选择

    导出默认的ListViewItem的模板到XAML中,然后你就可以复制这个模板到你的项目中,修改它。

    例如你要改选中的背景色,就需要改动 x:Name = "SelectionBackground" 的矩形的背景。

    2. RoutedEventArgs 没有Handled属性,不过 PointerEventArgs 有,所以你可以处理按钮的 Pointer 事件然后设置他的 Handled 为 true 。

    或者你完全可以在 ListView_ItemClick 中判断 e.OriginalSource 是谁,如果是Button 则可以忽略。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月18日 7:34
    版主
  • 看来不能用以前的路有事件的思路来思考,还是得用标记量来过滤。

            bool isButtonClicked = false;
            private void Button_Click_1(object sender, RoutedEventArgs e)
            {
                if (e.OriginalSource is Button) isButtonClicked = true;
            }
    
            private void ListView_ItemClick_1(object sender, ItemClickEventArgs e)
            {
                if (isButtonClicked) { isButtonClicked = false; return; }
            }


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月18日 9:46
    版主

全部回复

  • 两个问题不清楚

    1,如何改变ListView选中项的背景色

    2,在ListView的ItemTemplate里放入一个按钮,能否处理这个按钮的事件?


    关于第2个问题,我补充说明下,我现在只在处理按钮事件之后都会处理品listview的itemClick事件,能不能只处理按钮事件,不引发listview的itemClick事件。
    2012年4月18日 3:16
  • 先确认一下 是.Net XAML还是HTML5的方案?

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月18日 5:22
    版主
  • .Net XAML的方案!
    2012年4月18日 6:10
  • 1. 这种情况,你可以用带的Blend for VS 11 beta 打开一个项目。在Page中加一个ListView, 然后在ListView上右键,选择

    导出默认的ListViewItem的模板到XAML中,然后你就可以复制这个模板到你的项目中,修改它。

    例如你要改选中的背景色,就需要改动 x:Name = "SelectionBackground" 的矩形的背景。

    2. RoutedEventArgs 没有Handled属性,不过 PointerEventArgs 有,所以你可以处理按钮的 Pointer 事件然后设置他的 Handled 为 true 。

    或者你完全可以在 ListView_ItemClick 中判断 e.OriginalSource 是谁,如果是Button 则可以忽略。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月18日 7:34
    版主
  • " 在ListView_ItemClick 中判断 e.OriginalSource 是谁,如果是Button 则可以忽略"    e.OriginalSource 始终是ListView

    怎么捕获不到Button 的 Pointer 事件,需要有什么设置吗?

    2012年4月18日 8:13
  • 不好意思,忘掉了,这个现象和WPF里面是一致的,Button会把PointerPressed抑制掉,所以你是抓不到的。

    还是在 ListView_ItemClick 中判断 e.OriginalSource 是谁吧。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月18日 8:31
    版主
  •  ListView_ItemClick 中判断 e.OriginalSource 始终都是 ListView!
    2012年4月18日 9:27
  • 看来不能用以前的路有事件的思路来思考,还是得用标记量来过滤。

            bool isButtonClicked = false;
            private void Button_Click_1(object sender, RoutedEventArgs e)
            {
                if (e.OriginalSource is Button) isButtonClicked = true;
            }
    
            private void ListView_ItemClick_1(object sender, ItemClickEventArgs e)
            {
                if (isButtonClicked) { isButtonClicked = false; return; }
            }


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月18日 9:46
    版主
  • 你好。

    请问为什么我的一个GridView没有Edit Generated item Container(itemcontainerstyle)选项呢?


    • 已编辑 frglig 2012年4月19日 10:56 添加截图
    2012年4月19日 10:52
  • 手动先添加一个GridViewItem在里面,然后就有导出样式了:

        

    <GridView HorizontalAlignment="Left" Height="159" Margin="91,164,0,0" VerticalAlignment="Top" Width="380">
    <GridViewItem Template="{StaticResource GridViewItemControlTemplate1}"/>
    </GridView>


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月20日 5:47
    版主
  • 你好!

    我已经得到<ControlTemplate x:Key="GridViewItemControlTemplate1" TargetType="GridViewItem">这个东西,请问我要怎么应用在我的GridView上面呢?

    是<GridView.ItemContainerStyle></GridView.ItemContainerStyle>这个吗?

    2012年4月20日 6:55
  • WPF,Silverlight中设置自定义的样式模板的方式这里也是可以通用的,例如你的问题,你已经拿到了默认的模板,并且做了一定的修改,要将他应用到一个或者所有的此类型的元素上,我们就可以如下操作:

      1.在适当的元素下的Resources中建立一个Style

      2.这个Style如果包含x:Key 和 TargetType 那么我们需要个别地将这个Style通过StaticResource引用到特定元素上,例如:

      <Page.Resources>
        <Style x:Key="abc" TargetType="GridViewItem">
          <Setter Property="Template">
            <Setter.Value>
              <ControlTemplate TargetType="GridViewItem">
                ...
              </ControlTemplate>
            </Setter.Value>
          </Setter>
        </Style>
      </Page.Resources>
      ...
      <GridView ItemContainerStyle="{StaticResoruce abc}"/>

    如果没有指定x:Key,只有TargetType则这个样式默认会被应用到所有这个类型的元素上,除非之后这个类型元素有特定地样式指定。

      3. 还有种方式是内嵌型:

      <GridView>
        <GridView.ItemContainerStyle>
          <Style TargetType="GridViewItem">
            <Setter Property="Template">
              <Setter.Value>
                <ControlTemplate TargetType="GridViewItem">
                  ...
                </ControlTemplate>
              </Setter.Value>
            </Setter>
          </Style>
        </GridView.ItemContainerStyle>
      </GridView>


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月23日 9:04
    版主
  • 选中后item的背景色改变了,但是右上角多了一个图标,不知道如何屏蔽。如图黑色标记部分就是那个图标。Blend的设置如下:

    还需要修改什么内容!!!

    2012年5月4日 3:59
  • 试试设置SelectedCheckMarkOuter不可见
    2012年5月4日 4:54
  • frglig对的, SelectedCheckMarkOuter只是这个Mark的外部的边框,你可以一步步展开,看到

    里面有这个钩的Path 和其他元素,我们都是可以修改的。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年5月4日 7:03
    版主
  • 另外一个问题:当使用右键单击选中项时,会取消选中项,这个响应是否可以屏蔽,或着是更改为其他响应,比如把这个Item从ListView中删除掉。

    2012年5月4日 7:56
  • 再追加一个问题:ListView的item能否设最小高度,

    设置了如图所示中的MinHeigh,但不起作用。

    2012年5月4日 9:02
  • 再追加一个问题:ListView的item能否设最小高度,

    设置了如图所示中的MinHeigh,但不起作用。

    这样就可以了:

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



    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年5月7日 9:33
    版主
  • 另外一个问题:当使用右键单击选中项时,会取消选中项,这个响应是否可以屏蔽,或着是更改为其他响应,比如把这个Item从ListView中删除掉。

    目前只知道ItemClick是只响应鼠标左键,但这个对于你的问题似乎没用。 不过你可以处理 PointerPressed 事件,然后判断里面鼠标按下的按钮去做其他动作,但不能屏蔽原有的动作。

            private void ListView_PointerPressed_1(object sender, PointerEventArgs e)
            {
                if (e.GetCurrentPoint(sender as UIElement).Properties.IsRightButtonPressed == true)
                {
                    ...
                }
            }


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年5月7日 9:41
    版主
  • 精华帖子,学习了很多ListView模板的东西,在实际的应用中很有帮助,谢谢版主

    2012年11月7日 14:02