0

ボタンを含むリストボックスを作成したいのですが、ボタンを1つ選択(アニメーション)するたびに、コードは次のようになります。

<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」というアニメーションのみが機能します。

リストの最後かどうかを表示するときは、リストの最初に戻りたいと考えています。

4

2 に答える 2

0

ここにはいくつかの問題があります。DataTemplatesMVVMを読むことをお勧めします

まず第一に、ListBox (またはその他の にItemsControl基づく要素) に入力するために使用する項目は、厳密にはデータ項目である必要があります。これらには s などを含めることはできませんButton。アプリケーション ロジックと UI を WPF で分離して維持する方がはるかに優れています。

以下は、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}"/>
于 2013-02-17T12:44:03.940 に答える
0

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 の項目のコレクションにボタンを追加する必要はありません。文字列で十分です。したがって、クラス Temp を次のように変更する必要があります。

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

これらの変更により、ボタンを含むリストボックスが作成されます。これらのボタンには、Temp.Property プロパティからのテキストが表示されます。

于 2013-02-17T12:36:57.853 に答える