2011-12-12 69 views
1

我正在尝试构建一个带有编辑状态的项目的ListBox。我为Normal和Edit模式创建了一个单独的DataTemplate,但是一旦我更改了ContentPresenter上的ContentTemplate,我就失去了按钮与DataTempaltes(意味着按钮单击不再有任何动作)的事件冒泡。Silverlight ListBoxItem DataTemplate Button问题!?

下面是代码:

<UserControl.Resources> 

    <DataTemplate x:Key="NormalDT"> 
     <StackPanel> 
      <TextBlock Text="{Binding Property1}"/> 
      <CheckBox IsChecked="{Binding Property2, Mode=TwoWay}"/> 
      <Button Content="Test" Click="Button_Click" /> 
     </StackPanel> 
    </DataTemplate> 
    <DataTemplate x:Key="EditDT"> 
     <StackPanel> 
      <TextBox Text="{Binding Property1}"/> 
      <CheckBox IsChecked="{Binding Property2, Mode=TwoWay}"/> 
      <Button Content="Test" Click="Button_Click" /> 
     </StackPanel> 
    </DataTemplate> 
    <Style x:Key="ListBoxItemStyle1" TargetType="ListBoxItem"> 
     <Setter Property="Padding" Value="3"/> 
     <Setter Property="HorizontalContentAlignment" Value="Left"/> 
     <Setter Property="VerticalContentAlignment" Value="Top"/> 
     <Setter Property="Background" Value="Transparent"/> 
     <Setter Property="BorderThickness" Value="1"/> 
     <Setter Property="TabNavigation" Value="Local"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="ListBoxItem"> 
        <Grid Background="{TemplateBinding Background}"> 
         <VisualStateManager.VisualStateGroups> 
          <VisualStateGroup x:Name="CommonStates"> 
           <VisualState x:Name="Normal"/> 
           <VisualState x:Name="MouseOver"> 
            <Storyboard> 
             <DoubleAnimation Duration="0" To=".35" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="fillColor"/> 
            </Storyboard> 
           </VisualState> 
           <VisualState x:Name="Disabled"> 
            <Storyboard> 
             <DoubleAnimation Duration="0" To=".55" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="contentPresenter"/> 
            </Storyboard> 
           </VisualState> 
          </VisualStateGroup> 
          <VisualStateGroup x:Name="SelectionStates"> 
           <VisualState x:Name="Unselected"/> 
           <VisualState x:Name="Selected"> 
            <Storyboard> 
             <DoubleAnimation Duration="0" To=".75" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="fillColor2"/> 
            </Storyboard> 
           </VisualState> 
          </VisualStateGroup> 
          <VisualStateGroup x:Name="FocusStates"> 
           <VisualState x:Name="Focused"> 
            <Storyboard> 
             <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="Visibility" Storyboard.TargetName="FocusVisualElement"> 
              <DiscreteObjectKeyFrame KeyTime="0"> 
               <DiscreteObjectKeyFrame.Value> 
                <Visibility>Visible</Visibility> 
               </DiscreteObjectKeyFrame.Value> 
              </DiscreteObjectKeyFrame> 
             </ObjectAnimationUsingKeyFrames> 
             <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="contentPresenterEdit"> 
              <DiscreteObjectKeyFrame KeyTime="0"> 
               <DiscreteObjectKeyFrame.Value> 
                <Visibility>Visible</Visibility> 
               </DiscreteObjectKeyFrame.Value> 
              </DiscreteObjectKeyFrame> 
             </ObjectAnimationUsingKeyFrames> 
             <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="contentPresenter"> 
              <DiscreteObjectKeyFrame KeyTime="0"> 
               <DiscreteObjectKeyFrame.Value> 
                <Visibility>Collapsed</Visibility> 
               </DiscreteObjectKeyFrame.Value> 
              </DiscreteObjectKeyFrame> 
             </ObjectAnimationUsingKeyFrames> 
            </Storyboard> 
           </VisualState> 
           <VisualState x:Name="Unfocused"/> 
          </VisualStateGroup> 
         </VisualStateManager.VisualStateGroups> 
         <Rectangle x:Name="fillColor" Fill="#FFBADDE9" IsHitTestVisible="False" Opacity="0" RadiusY="1" RadiusX="1"/> 
         <Rectangle x:Name="fillColor2" Fill="#FFBADDE9" IsHitTestVisible="False" Opacity="0" RadiusY="1" RadiusX="1"/> 
         <ContentPresenter x:Name="contentPresenter" 
              ContentTemplate="{StaticResource NormalDT}" 
              Content="{TemplateBinding Content}" 
              HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
              Margin="{TemplateBinding Padding}"/> 

         <ContentPresenter x:Name="contentPresenterEdit" 
              ContentTemplate="{StaticResource EditDT}" 
              Content="{TemplateBinding Content}" 
              HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
              Margin="{TemplateBinding Padding}" Visibility="Collapsed"/> 
         <Rectangle x:Name="FocusVisualElement" RadiusY="1" RadiusX="1" Stroke="#FF6DBDD1" StrokeThickness="1" Visibility="Collapsed"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</UserControl.Resources> 

<Grid x:Name="LayoutRoot" Background="White" DataContext="{Binding Source={StaticResource SampleDataSource}}"> 
    <ListBox Height="263" Margin="33,54,366,0" VerticalAlignment="Top" ItemTemplate="{StaticResource NormalDT}" ItemsSource="{Binding Collection}" ItemContainerStyle="{StaticResource ListBoxItemStyle1}"/> 

</Grid> 

我如何能得到button_click事件在我的处境工作任何想法?

任何帮助,非常感谢!

谢谢。

回答

1

由于某些原因,我不知道,在您的焦点视觉状态下定义的Visibility动画导致此问题。

尝试动画Opacity而不是它应该工作。

UPDATE

其实,你的代码不会在WPF的工作。我认为这是Silverlight中的一个错误。如果您将MouseLeftButtonDown事件附加到TextBlock,它实际上会触发,但ButtonsCheckBoxes的情况并非如此。

然后,我怀疑这可能是这一点,但在可见性设置为折叠我不是100%肯定...

在此之前的Silverlight 5,ButtonBase不改变视觉状态 ,所以当控制器再次可见 ,它在隐身之前保持在视觉状态。

+2

YOU ARE GOLDEN Xin !!! :D 我用不透明度交换了可见性操作,现在按钮点击起泡。 SWEEEET! 谢谢soooooo多! – asuciu

+0

不客气。 :) –