创建一个包含按钮的列表框,并定期选择一个按钮(类似于旋转木马)

本文关键字:按钮 一个 选择 类似于 旋转木马 包含 创建 列表 | 更新日期: 2023-09-27 17:59:49

我想创建一个包含按钮的列表框,每次选择一个按钮(动画),我的代码如下:

<UserControl x:Class="sa.UserControl2"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="108" d:DesignWidth="592" xmlns:my="clr-namespace:sa">
    <Grid Width="572">
        <ListBox  Name="ListBoxV"  ScrollViewer.HorizontalScrollBarVisibility="Hidden"
                  Height="96" HorizontalAlignment="Left" VerticalAlignment="Top"
                  Width="572"
                  ItemsSource="{Binding ListItems}" >
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Setter Property="Padding" Value="30 0 30 0" />
                </Style>
            </ListBox.ItemContainerStyle>

        </ListBox>
    </Grid>
</UserControl>

 public UserControl2()
    {
        InitializeComponent();
           List<Temp> ListItems = new List<Temp>();
            for (int i = 0; i < 20; i++)
            {
                ListItems.Add(new  Temp("a"+i));
            }
            ListBoxV.ItemsSource = ListItems;
            DispatcherTimer dt = new DispatcherTimer();
            dt.Tick += new EventHandler(dt_Tick);
            dt.Interval = TimeSpan.FromSeconds(2);
            dt.Start();
        }
        void dt_Tick(object sender, EventArgs e)
        {
            if ((ListBoxV.SelectedIndex + 1) < ListBoxV.Items.Count)
                ListBoxV.SelectedIndex = ListBoxV.SelectedIndex + 1;
            else
                ListBoxV.SelectedIndex = 0;
            ListBoxV.ScrollIntoView(ListBoxV.SelectedItem);
        }
        public class Temp
        {
               public Temp(string s)
               {Button b = new Button();
                b.Name=s;            }

        }
    }

列表框不显示按钮,只有动画在工作为每个元素指定"sa.UserControl2.Temp"。

当显示列表的末尾时,它希望回到列表的开头。

创建一个包含按钮的列表框,并定期选择一个按钮(类似于旋转木马)

这里有几个问题。我建议你阅读DataTemplates和MVVM

首先,用于填充ListBox(或任何其他基于ItemsControl的元素)的项应该是DataItems。它们不能包含Buttons这样的东西。在WPF中保持应用程序逻辑和UI分离要好得多。

下面是一个带有ItemTemplate的ListBox示例:

<ListBox  Name="ListBoxV"  ScrollViewer.HorizontalScrollBarVisibility="Hidden"
          Height="96" HorizontalAlignment="Left" VerticalAlignment="Top"
          Width="572"
          ItemsSource="{Binding ListItems}" >
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="Padding" Value="30 0 30 0" />
        </Style>
    </ListBox.ItemContainerStyle>
    <ListBox.ItemTemplate>
       <DataTemplate>
           <Button Content="{Binding Property}"/>
       </DataTemplate>
</ListBox>

数据项:

public class Temp
{
    string Property {get;set;}
    public Temp(string s)
    {
        Property = s;
    }
}

还要注意,当您在类Temp中更改这些属性时,为了支持UI上的更新,它必须实现System.ComponentModel.INotifyPropertyChanged接口。

然后,如果你想在点击每个项目的按钮时执行一个操作,你必须使用ICommand:

public class Temp
{
    string Property {get;set;}
    public Temp(string s)
    {
        Property = s;
        DoSomethingCommand = new DelegateCommand(x => DoSomething());
    }
    public DelegateCommand DoSomethingCommand {get;set;}
    private void DoSomething()
    {
        //DoSomething when the Button is Clicked!!
    }
}

XAML:

<Button Content="{Binding Property}" Command="{Binding DoSomethingCommand}"/>

要在ListBox中显示按钮,必须为其编写ItemTemplate

<ListBox  Name="ListBoxV"  ScrollViewer.HorizontalScrollBarVisibility="Hidden"
                  Height="96" HorizontalAlignment="Left" VerticalAlignment="Top"
                  Width="572"
                  ItemsSource="{Binding ListItems}" >
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Setter Property="Padding" Value="30 0 30 0" />
                </Style>
            </ListBox.ItemContainerStyle>
 <ListBox.ItemTempate>
     <DataTemplate>
          <Button Content="{Binding Property}"/>
     </DataTemplate>
 </ListBox.ItemTempate>

接下来,您不需要向ListBox的项目集合添加按钮,字符串就可以了。所以你的班级临时需要改成这样:

class Temp{
    string Property {get;set;}
    public Temp(string s){
        Property = s;
    }
}

通过这些更改,您将拥有一个包含按钮的列表框。这些按钮将显示Temp.Property属性中的文本。