WPF按钮在弹出窗口中不会触发并冻结控制

时间:2011-07-16 00:52:54

标签: wpf xaml controls popup styles

我在使用mouseenter事件弹出的自定义控件中有一个弹出窗口。 弹出窗口和按钮显示正常。 当我单击按钮时,控件冻结并且不会触发命令。要解冻,我必须尽量减少窗口。

弹出代码如下:

<Popup Name="Popup_PrevButton"
       PlacementTarget="{Binding ElementName=PART_Button}"
       Placement="Left" 
       StaysOpen="False"
       AllowsTransparency="True" 
       PopupAnimation="Fade"
       Focusable="True">
     <Grid>
           <Button
           Name="Button_PrevButton"
           Margin="2,0,2,0" 
           Width="20" 
           Height="48"
           BorderBrush="{TemplateBinding BorderBrush}" 
           BorderThickness="{TemplateBinding BorderThickness}" 
           Foreground="{TemplateBinding Foreground}"
           Command="{Binding Path=Button_NextButton}">
           </Button>
      </Grid>
</Popup>

如果我使用Click = Button_NextButton,我会收到一条错误消息: 无法从文本“Button_NextButton”创建“点击”。

更新

我已经更新了我的代码并按照建议实现了RelayCommand类。我将绑定更改为

Command="{Binding Path=nCommand:CustomCommands.Button_Click}">

我相信我已经绑定了命令(通过改变我破坏程序的东西,所以它不会运行 - 例如:如果我删除了sub,那么我得到一个错误,sub不存在),但是当我点击按钮时,同样的事情发生了。

按钮命令如下:

Private Sub ON_Button_Click(ByVal sender As Object, ByVal e As ExecutedRoutedEventArgs)
    'Do something here
End Sub

nCommand代码:     Public Shared Button_PrevButton_Click As New RoutedCommand(“Button_PrevButton_Click”,GetType(MainWindow))

MainWindow中的绑定:                   

所以基本上我知道编译器正在看东西,但是当我实际点击它时不会将它传递给sub。还有什么进一步的想法吗?

2 个答案:

答案 0 :(得分:1)

如果出现这样的错误,您在代码中创建的方法签名是错误的,例如指定MouseEventArgs而非通用RoutedEventArgs

除此之外,我发现这个XAML没有问题,如果绑定实际上绑定到一个命令,它不会做一些相当奇怪的事情它应该工作。按钮位于弹出窗口内的事实应该不是问题。

答案 1 :(得分:1)

按钮的Command属性应该绑定到对象集上的某些东西,作为实现ICommand接口的DataContext(如提到的H.B.)。

实现此目的的一种简单方法是使用包装类,其中包含ICommand实现的许多机制。这是关于MVVM的一篇很好的介绍性文章的a link,其中包含RelayCommand类的实现。

整篇文章读起来很棒,但您可以跳到“中继命令逻辑”部分来查看实现。

希望有所帮助!

相关问题