创建一个包含按钮的列表框,并定期选择一个按钮(类似于旋转木马)
本文关键字:按钮 一个 选择 类似于 旋转木马 包含 创建 列表 | 更新日期: 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。它们不能包含Button
s这样的东西。在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属性中的文本。