簡體   English   中英

訪問ItemsControl中的控件

[英]Accessing controls in ItemsControl

我正在創建一個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簡單地說,我想知道哪個按鈕生成了事件-可以使用索引來完成。 如果是這樣,怎么辦? 請幫助

實際的Button在sender參數中傳遞給事件處理程序:

Button button = sender as Button;

但是,有一個問題。 由於Button處理MouseDown事件,因此您將無法獲得它。 您將不得不為PreviewMouseDown事件添加一個處理程序,或者為Button的Click事件添加一個處理程序。

並請注意: ItemCollection.GetItemAt方法使用從零開始的索引。

編輯:這是如何將Button的Tag屬性綁定到ItemsControl的AlternationIndex屬性,以及如何在Button的Click處理程序中利用該索引:

<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}">

Click處理程序:

private void Button_Click(object sender, RoutedEventArgs e)
{
    Button button = sender as Button;
    int index = (int)button.Tag;
    // get page by zero-based index
    ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM