2012-09-07 143 views
3

我对WPF颇为新颖,仍然试图找出它的所有细节;) 我有一个奇怪的问题,按钮没有提高其点击事件。我有一个名为PopupButton的UserControl,它基本上是一个按钮,点击时弹出窗口。弹出窗口的内容是ContentPresenter,并绑定到PopupButton上的名为PopupContentHolder的依赖项属性。 然后在主窗体上我有DataGridTemplateColumn一个DataGrid,其中在<DataGridTemplateColumn.CellTemplate> <DataTemplate>,我把我的弹出式按钮。然后,我给ItemTemplate分配一个列表框作为我的PopupButton弹出窗口的内容。 简单,这看起来如下点击事件不会引发数据网格弹出按钮上的按钮

<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放在DataGrid外部时,everythinkg就可以完美工作。另外当我把上面的列表框直接放在网格单元格中时,它就起作用了。 也许它的错误与我的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(); 
     } 
    } 
} 

有任何人任何线索,什么都可以错呢? 谢谢。

+0

如果这是你的用户控件的一个问题你应该张贴的代码为你的用户控件了。 –

+0

感谢您的提示。我已经为UserControl添加了xaml和代码。 – Mirek

+0

如果有人可以帮助解决我的问题,我将不胜感激。 – Mirek

回答

1

我也终于改写弹出式按钮为CustomControl解决这个问题。在那里,而不是射击故事板关闭弹出,当包含按钮被点击我用下面的代码

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

添加主弹出按钮单击处理程序,这将在弹出的调用,即使事件已经是由源按钮处理。

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

有关处理更多信息已经处理路由事件here

0

也许它只是一个错字,因为在代码中的btn_Click和Button_Click事件处理程序。 你介意提供PopupContentHolder的代码也许整个弹出式按钮类?