2012-09-07 69 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的代碼也許整個彈出式按鈕類?