0

WPFアプリケーションを作成しています。ボタンをクリックするたびにページを表示したい。

 <ItemsControl ItemsSource="{Binding Path=DashBoardApps}" VerticalAlignment="Bottom" HorizontalAlignment="Center" Name="Abc">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Controls:FishEyeControl />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Button MouseDown="Button_MouseDown">
                            <Image  Source="{Binding Path=ApplicationImage}" Width="32" Height="32"/>
                        </Button>
                        <TextBlock x:Name="txtAppName" Text="{Binding Path=ApplicationName}" TextAlignment="Center" Visibility="Hidden" FontSize="7px" Foreground="#eff7ff" VerticalAlignment="Center"/>
                    </StackPanel>
                    <DataTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter TargetName="txtAppName" Property="Visibility" Value="Visible" />
                        </Trigger>
                    </DataTemplate.Triggers>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

全部で6つのボタンがあります。ボタンをクリックすると、ページを表示したいです(ボタンごとに異なるページ)。背後にあるコードでは、私はこのようなことをしました

private void Button_MouseDown(object sender, MouseButtonEventArgs e)
    {
        var s = sender as ItemsControl;
        if (s == Abc.Items.GetItemAt(1))//if it is the first button. Not sure if it is right
        {
           //Code to display page
        }

    }

どのボタンがイベントを生成したか知りたいです。のように、最初のボタンがクリックされた場合は、page1を表示する必要があります。そこで、GetItemAt()関数を使って最初のボタンがクリックされたかどうかを確認してみました(最初のページを表示するため)。しかし、それは機能せず、このアプローチが正しいかどうかはわかりません。

PS簡単に言うと、どのボタンがイベントを生成したか知りたいのですが、これはインデックスを使用して実行できますか。もしそうなら、どのように?親切に助けて

4

1 に答える 1

3

実際のボタンは、sender引数でイベントハンドラーに渡されます。

Button button = sender as Button;

ただし、問題があります。ButtonはMouseDownイベントを処理するため、取得できません。PreviewMouseDownイベントのハンドラーを追加するか、ButtonのClickイベントのハンドラーを追加する必要があります。

また、注意点として、ItemCollection.GetItemAtメソッドはゼロベースのインデックスを使用します。

編集:ボタンのTagプロパティをItemsControlのプロパティにバインドするAlternationIndex方法と、ボタンのクリックハンドラーでそのインデックスを利用する方法は次のとおりです。

<ItemsControl ... AlternationCount="2147483647">
...
<ItemsControl.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
            <Button Click="Button_Click"
                    Tag="{Binding RelativeSource={RelativeSource Mode=TemplatedParent},
                                  Path=(ItemsControl.AlternationIndex)}">
            ...
        </StackPanel>
        ...
    </DataTemplate>
</ItemsControl.ItemTemplate>

XAML名前空間xmlns:sys="clr-namespace:System;assembly=mscorlib"を使用すると、代わりに次のように記述できます。

<ItemsControl AlternationCount="{x:Static sys:Int32.MaxValue}">

クリックハンドラー:

private void Button_Click(object sender, RoutedEventArgs e)
{
    Button button = sender as Button;
    int index = (int)button.Tag;
    // get page by zero-based index
    ...
}
于 2012-08-21T08:43:24.307 に答える