【问题标题】:Accessing controls in ItemsControl访问 ItemsControl 中的控件
【发布时间】:2012-08-21 08:31:24
【问题描述】:

我正在创建一个 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() 函数来查看是否单击了第一个按钮(以显示第一页)。但是它不起作用,我不确定这种方法是否正确。

P.S 简单地说我想知道哪个按钮生成了事件——这可以使用 index.html 来完成吗?如果是这样,怎么做? 请帮忙

【问题讨论】:

    标签: c# wpf visual-studio-2010 xaml


    【解决方案1】:

    实际的 Button 在 sender 参数中传递给事件处理程序:

    Button button = sender as Button;
    

    但是有一个问题。由于 Button 处理 MouseDown 事件,因此您不会得到它。您必须为PreviewMouseDown 事件添加一个处理程序,或者更好地为按钮的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}">
    

    点击处理程序:

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

    【讨论】:

    • 是的。我知道实际的按钮是作为发件人传递的。现在我想知道是单击了 Button1 还是单击了 Button2。请注意这里我使用的是 ItemsControl。是否可以使用索引来做到这一点?
    • 我如何确定它是第一个按钮还是其他按钮?
    • 当然,但你没有问这个。有关可能的解决方案,请参阅this SO question。例如,您可以将 Button 的 Tag 属性绑定到 AlternationIndex,然后从 Click 处理程序访问 Tag 中的索引。
    • 你能告诉我怎么做吗?我将AlternationIndex 添加到按钮的标签中。如何访问 CLick 处理程序中的索引?抱歉,我是新手。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    相关资源
    最近更新 更多