none
有关自定义ListBox的问题 RRS feed

  • 问题

  • 我设计了一个ListBoxItem的模板,每个Item里面都有一个Button按钮,请问这个按钮的Click方法写在哪里?怎么写?

    要求是在点击的时候,获得当前点击的这个ListBoxItem的对象

    我是希望能够在窗体的xaml文件中,通过”Click=xxx"这种方式来添加代码,但是由于ListBoxItem是运行中动态添加的,完全不知道怎么做好。。。



    da jia hao!

    2019年8月30日 7:45

答案

  • 在resource中定义style如下

           <Style TargetType="ListBoxItem">
                <Setter Property="Padding" Value="0"/>
                <!--使用margin来修饰item之间距离-->
                <Setter Property="Margin"  Value="0,1,0,1"/>
                <Setter Property="BorderThickness" Value="0"/>
            </Style>

    其中

    padding是用来修饰item之间距离,默认4,1

    margin是默认值原是空值,(0,0,0,0)

    boderthickness是选择时选择框的边框值,如果是想出现选择框,可以根据效果适当修改。

    并在listbox上定义如下

    ScrollViewer.VerticalScrollBarVisibility="Hidden" ScrollViewer.HorizontalScrollBarVisibility="Hidden"  


    结果如下




    2019年9月2日 10:30

全部回复

  • 关于模板中click方法问题有

    方法一

    将ListBoxItem的模板提出来,单独写在Resource中,再通过绑定的方式来使用 。如下

    <Window.Resources>
            <DataTemplate x:Key="ItemTemplateForListBoxItem">
                <Grid MinWidth="40">    
                    <Button x:Name="Btn" Click="Btn_Click"/>
                </Grid>
            </DataTemplate>
        </Window.Resources>
        <Grid>
            <ListBox ItemTemplate="{StaticResource ItemTemplateForListBoxItem}"/>
        </Grid>


    方法二

    不单独提出来,直接创建事件即可

    关于你在点击时获取listboxitem对象方法如下


    首先修改xaml代码如下

     <DataTemplate x:Key="ItemTemplateForListBoxItem">
                <Grid MinWidth="40" >
                    <!--此处的button是可以通过点击建立方法-->
                    <Button Tag="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorLevel=1,AncestorType=ListBoxItem}}" x:Name="Btn"  Click="Btn_Click"/>
                </Grid>
            </DataTemplate>

    在相对应的cs页面中的方法中编写如下代码

    private void Btn_Click(object sender, RoutedEventArgs e) {

    //b为listboxitem对象 var b = (sender as Button).Tag as ListBoxItem; }








    • 已编辑 ARM830 2019年8月30日 9:42
    2019年8月30日 9:37
  • 谢谢。

    测试过,发现按钮的click问题解决了。但是listboxitem的外观有问题:

    不知道为何每个ListBoxItem的周围都会有空白?这直接导致了最右边的按钮没能显示完整,而且还出现了滚动条。下面是全部代码

    XAML:

    <Window x:Class="WpfApplication2.ListBoxTest"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApplication2"
            mc:Ignorable="d"
            Title="ListBoxTest" Height="450" Width="800"
            Loaded="Window_Loaded">    
        <Window.Resources>
            <DataTemplate x:Key="ItemTemplateForListBoxItem">
                <Grid Background="Aquamarine" Margin="0" Height="36" Width="{Binding ActualWidth,RelativeSource={RelativeSource AncestorType=ListBox}}">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"></ColumnDefinition>
                        <ColumnDefinition Width="auto"></ColumnDefinition>
                    </Grid.ColumnDefinitions>
                    
                    <TextBlock Text="{Binding ItemName}"></TextBlock>
                    <Button Grid.Column="1" x:Name="Btn" Click="Btn_Click" Content="我是按钮"/>
                </Grid>
            </DataTemplate>
        </Window.Resources>
        <Grid>
            <ListBox Name="listbox1" ItemTemplate="{StaticResource ItemTemplateForListBoxItem}"></ListBox>
        </Grid>
    </Window>
    

    C#:

    namespace WpfApplication2
    {
        /// <summary>
        /// ListBoxTest.xaml 的交互逻辑
        /// </summary>
        /// 
        public class MyItemList
        {
            public string ItemName { get; set; }
            public bool IsNew { get; set; }
        }
        public partial class ListBoxTest : Window
        {
            List<MyItemList> itemList;
            public ListBoxTest()
            {
                InitializeComponent();
                itemList = new List<MyItemList>();
            }
    
            private void Btn_Click(object sender, RoutedEventArgs e)
            {
                var b = (sender as Button).Tag as ListBoxItem;
                MyItemList o = b.DataContext as MyItemList;
                MessageBox.Show(o.ItemName);
            }
    
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                var item = new MyItemList();
                item.ItemName = "项目一";
                item.IsNew = true;
                itemList.Add(item);
    
                item = new MyItemList();
                item.ItemName = "项目二";
                item.IsNew = false;
                itemList.Add(item);
                listbox1.ItemsSource = itemList;
            }
        }
    }
    



    da jia hao!

    2019年9月2日 7:00
  • 在resource中定义style如下

           <Style TargetType="ListBoxItem">
                <Setter Property="Padding" Value="0"/>
                <!--使用margin来修饰item之间距离-->
                <Setter Property="Margin"  Value="0,1,0,1"/>
                <Setter Property="BorderThickness" Value="0"/>
            </Style>

    其中

    padding是用来修饰item之间距离,默认4,1

    margin是默认值原是空值,(0,0,0,0)

    boderthickness是选择时选择框的边框值,如果是想出现选择框,可以根据效果适当修改。

    并在listbox上定义如下

    ScrollViewer.VerticalScrollBarVisibility="Hidden" ScrollViewer.HorizontalScrollBarVisibility="Hidden"  


    结果如下




    2019年9月2日 10:30
  • 谢谢!

    但是还有问题,就是我不能针对所有ListBoxItem都设置同样的Style,而如果给Style一个Key属性的话,那么在ListBox的ItemTemplate属性里面,好像是不能同时引用Style和DataTemplate的吧?

    所以说,DataTemplate和Template之间怎么兼容呢?


    da jia hao!



    • 已编辑 liubin 2019年9月3日 6:44
    2019年9月3日 6:40
  • style放在window的resource中,不设置key,只设置targettype时,则是默认匹配任何符合类型。

    也就是说针对listboxitem的style样式,可以不用设置key,只设置targettype

    在datatemplate和controltemplate之间是不会冲突的。

    例如

      <Window.Resources>
            <Style TargetType="ListBoxItem">
                <Setter Property="Padding" Value="1,1"/>
                <!--使用margin来修饰item之间距离-->
                <Setter Property="Margin"  Value="0.1"/>
                <Setter Property="BorderThickness" Value="0"/>
            </Style>
            <DataTemplate x:Key="ItemTemplateForListBoxItem">
                <Grid MinWidth="40" Background="Red"  Width="{Binding ActualWidth,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ListBoxItem,AncestorLevel=1}}">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="auto"/>
                    </Grid.ColumnDefinitions>
                    <!--此处的button是可以通过点击建立方法-->
                    <Button Grid.Column="1" Width="90" Tag="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorLevel=1,AncestorType=ListBoxItem}}" x:Name="Btn" Content="{Binding Name}"   Click="Btn_Click"/>
                </Grid>
            </DataTemplate>
          

    <ListBox x:Name="LB" ScrollViewer.VerticalScrollBarVisibility="Hidden" ScrollViewer.HorizontalScrollBarVisibility="Hidden"  ItemTemplate="{StaticResource ItemTemplateForListBoxItem }" />
                


    • 已编辑 ARM830 2019年9月3日 6:54
    2019年9月3日 6:53