在DataGrid弹出窗口中,Button的Click事件未被触发。

3

我对WPF还比较陌生,一直在努力理解它的各个细节;) 我遇到了一个奇怪的问题:按钮无法触发其单击事件。 我有一个名为PopupButton的UserControl,它基本上是一个带有弹出窗口的按钮。弹出窗口的内容是ContentPresenter,并且绑定到PopupButton上的依赖属性PopupContentHolder。 然后,在主窗体上,我有一个DataGrid,其中有DataGridTemplateColumn,我在其中放置了我的PopupButton <DataGridTemplateColumn.CellTemplate> <DataTemplate>。 然后,我为PopupButton分配一个带有ItemTemplate的列表框作为其弹出窗口的内容。 简单来说,这看起来如下

<DataGrid HorizontalAlignment="Stretch"
        VerticalAlignment="Stretch"
        HorizontalContentAlignment="Stretch"
        ColumnHeaderHeight="40"
        FontSize="11"
        HorizontalScrollBarVisibility="Disabled"
        ItemsSource="{Binding Pocos}"
        RowHeight="30"
        SnapsToDevicePixels="True"
        VerticalScrollBarVisibility="Disabled">
<DataGrid.Columns>
    <DataGridTemplateColumn MinWidth="70" Header="NAme">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <controls:PopupButton DoPopupOnMainButton="True"
                                        Foreground="{StaticResource HeaderLinkActiveColor}"
                                        MarkButtonOnPopup="True"
                                        PopupBackground="{StaticResource PopupBackground}"
                                        PopupPadding="5"
                                        ShowDownArrow="False"
                                        Text="Some test button">
                    <controls:PopupButton.PopupContentHolder>
                        <StackPanel>
                            <ListBox Background="Transparent" ItemsSource="{Binding Tenders}">
                                <ListBox.ItemTemplate>
                                    <DataTemplate>
                                        <Button Margin="0,2,0,0"
                                                Click="Button_Click"
                                                Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}},
                                                                    Path=DataContext.SaveCommand}"
                                                Content="{Binding .}"
                                                FontSize="11" />
                                    </DataTemplate>
                                </ListBox.ItemTemplate>
                            </ListBox>
                        </StackPanel>
                    </controls:PopupButton.PopupContentHolder>
                </controls:PopupButton>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
</DataGrid.Columns>

现在问题出现在PopupButton内部的ListBox中的按钮,既不会触发Click事件也不会触发Command。此外,当我将PopupButton放在DataGrid之外时,一切都完美运行。而且,当我直接将列表框放在网格单元格中时,它也可以正常工作。可能是我的PopupButtonControl出了些问题。
<UserControl x:Class="WpfApplication1.PopupButton"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         x:Name="userControlRoot"
         Width="Auto"
         Height="Auto">
<UserControl.Resources>
    <BooleanToVisibilityConverter x:Key="BoolToVis" />

    <Storyboard x:Key="PopupCloseStoryBoard">
        <BooleanAnimationUsingKeyFrames Storyboard.TargetName="popup" Storyboard.TargetProperty="IsOpen">
            <DiscreteBooleanKeyFrame KeyTime="0:0:0.1" Value="False" />
        </BooleanAnimationUsingKeyFrames>
    </Storyboard>

    <Storyboard x:Key="PopupOpenStoryBoard">
        <BooleanAnimationUsingKeyFrames Storyboard.TargetName="popup" Storyboard.TargetProperty="IsOpen">
            <DiscreteBooleanKeyFrame KeyTime="0:0:0.0" Value="True" />
        </BooleanAnimationUsingKeyFrames>
    </Storyboard>


</UserControl.Resources>

<Grid>

    <Border x:Name="brdButtonBack"
            Background="Transparent"
            CornerRadius="3,3,0,0"
            Padding="{Binding Padding,
                              ElementName=userControlRoot}" />

    <Button x:Name="btnMain"
            HorizontalAlignment="Center"
            VerticalAlignment="Center"
            Click="btn_Click"
            Command="{Binding MainCommand,
                              ElementName=userControlRoot}"
            Content="{Binding Text,
                              ElementName=userControlRoot}"
            IsEnabled="{Binding IsEnabled,
                                ElementName=userControlRoot}" />

    <Popup x:Name="popup"
           MinWidth="{Binding ActualWidth,
                              ElementName=userControlRoot}"
           AllowsTransparency="True"
           Placement="Bottom"
           PlacementTarget="{Binding ElementName=brdButtonBack}"
           PopupAnimation="Slide"
           StaysOpen="False">
        <Border Background="{Binding PopupBackground,
                                     ElementName=userControlRoot}"
                BorderBrush="White"
                CornerRadius="0,3,3,3"
                Padding="{Binding PopupPadding,
                                  ElementName=userControlRoot}">

            <ContentPresenter Content="{Binding PopupContentHolder, ElementName=userControlRoot}" />
        </Border>
    </Popup>

</Grid>

我已经简化了控件,但问题仍然存在。控件的后台代码主要包含依赖属性,唯一的逻辑如下所示:

public partial class PopupButton : UserControl
{
    //... dependency properties

    public PopupButton()
    {
        InitializeComponent();
    }

    private void btn_Click(object sender, RoutedEventArgs e)
    {
            Storyboard s = (Storyboard)TryFindResource("PopupOpenStoryBoard");
            s.Begin();
    }

    private void popup_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        //trick to close popup when the button inside is clicked
        //this must be done with storyboard and delay
        //since popup can not be closed before the event reaches clicked
        //button
        if (e.Source is Button)
        {
            Storyboard s = (Storyboard)TryFindResource("PopupCloseStoryBoard");
            s.Begin();
        }
    }
}

有人知道它出了什么问题吗?谢谢。

如果这是您的用户控件出现问题,您应该同时发布您的用户控件代码。 - Trevor Elliott
谢谢你的提示。我已经添加了UserControl的XAML和代码后端。 - Mirek
如果有人能帮忙解决我的问题,我会非常感激。 - Mirek
2个回答

1

最终我通过将PopupButton重写为CustomControl来解决了这个问题。在那里,当包含的按钮被点击时,我使用以下代码而不是触发StoryBoard来关闭弹出窗口:

mainPopup.AddHandler(Button.ClickEvent, new RoutedEventHandler(mainPopup_ButtonClick), true);

为主弹出窗口添加按钮点击处理程序,即使事件已被源按钮处理,该处理程序也将在弹出窗口上调用。

    void mainPopup_ButtonClick(object sender, RoutedEventArgs e)
    {
        MainPopup.IsOpen = false;
    }

关于处理已处理的路由事件的更多信息在这里


0
也许这只是一个打字错误,因为您的代码中有btn_Click和Button_Click事件处理程序。您能否提供PopupContentHolder的代码或整个PopupButton类的代码?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接