2014-03-03 84 views
0

我有一個如下代碼片段。我想單擊測試按鈕來顯示擴展器,並讓擴展器覆蓋同一行中的TextBlock和ComboBox。我試過某人的解決方案來設置ZIndex,但不起作用。任何人都可以幫忙如何覆蓋擴展到另一個控件wpf

<Window.Resources> 
    <Storyboard x:Key="show" TargetProperty="Height"> 
     <DoubleAnimation Storyboard.TargetName="TestRec" Duration="0:0:0.3" From="0" To="300"/> 
    </Storyboard> 
</Window.Resources> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <Button Content="showRectangle" Click="Button_Click"/> 
    <TextBlock Text="Test TextBlock" Grid.Row="1"/> 
    <ComboBox Grid.Column="1" Grid.Row="1" SelectedIndex="0"> 
     <ComboBoxItem Content="A"/> 
     <ComboBoxItem Content="B"/> 
     <ComboBoxItem Content="C"/> 
     <ComboBoxItem Content="D"/> 
    </ComboBox> 
    <Grid Grid.Row="1" Grid.ColumnSpan="2" x:Name="TestRec" Height="0"> 
     <Expander Header="abc" IsExpanded="True"> 
      <Expander.Content> 
       <ListView ItemsSource="{Binding List}"> 
        <ListView.ItemTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding}"/> 
         </DataTemplate> 
        </ListView.ItemTemplate> 
       </ListView> 
      </Expander.Content> 
     </Expander> 
    </Grid> 
</Grid> 


private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     this.BeginStoryboard(FindResource("show") as Storyboard); 
    } 
+0

單擊按鈕會發生什麼? –

+0

@OscarPaz擴展器內容和組合框內容混合 – James

回答

1

將擴展器的背景設置爲白色。

<Expander Header="abc" IsExpanded="True" Background="White"> 
+1

據我所知,它是一樣的東西。 –

+0

你說得對。我沒有先檢查。我改變了答案。 – Bijan

+0

如果我明確地設置背景,它不會在高對比度模式下工作 – James

0

即解決方案是可靠的,我建議你把它們藏在Storyboard。設置控件的名稱,在這種情況下使用TestTextBlockTestComboBox

<Window x:Class="MyProject.MainWindow" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib" 

... 

<Storyboard x:Key="show"> 
    <DoubleAnimation Storyboard.TargetName="TestRec" 
        Storyboard.TargetProperty="Height" 
        Duration="0:0:0.3" 
        From="0" 
        To="300" /> 

    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="TestTextBlock" 
            Storyboard.TargetProperty="Opacity"> 

     <DiscreteObjectKeyFrame KeyTime="0:0:0"> 
      <DiscreteObjectKeyFrame.Value> 
       <sys:Double>0.0</sys:Double> 
      </DiscreteObjectKeyFrame.Value> 
     </DiscreteObjectKeyFrame> 
    </ObjectAnimationUsingKeyFrames> 

    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="TestComboBox" 
            Storyboard.TargetProperty="Opacity"> 

     <DiscreteObjectKeyFrame KeyTime="0:0:0"> 
      <DiscreteObjectKeyFrame.Value> 
       <sys:Double>0.0</sys:Double> 
      </DiscreteObjectKeyFrame.Value> 
     </DiscreteObjectKeyFrame> 
    </ObjectAnimationUsingKeyFrames> 
</Storyboard> 

在這種情況下,也可以使用DoubleAnimation如果將使用Opacity屬性。根據另一個Storyboard,您將通過將Opacity設置爲1.0來顯示它們。

+0

爲什麼使用ZIndex無法正常工作?除了設置其他控件的不透明度外,是否還有其他方法?擴展器有一個明確的高度,但其他控件可能很長,也許我不應該在這裏使用文本塊和組合框。如果是ListView,我希望擴展器覆蓋listview的一部分,如果設置了listview的不透明度,整個listview將不會顯示 – James

+0

@James:在我的例子中'ZIndex'對ComboBox和Expander工作正常。不僅適用於「TextBlock」,可能是因爲他在另一列。 –

+0

@James:如果你願意,我可以用'ZIndex'向你展示我的例子。但我認爲你需要做出你的例子:當你在同一列中隱藏一個控件時,或者當你通過設置「不透明度」或「可視性」隱藏其他控件時,用'ZIndex'。 –

0

@Bizz之外,如果pc不處於高對比度模式,您可以爲擴展器設置樣式, 將背景設置爲白色。

<Style.Triggers> 
      <DataTrigger Binding="{Binding Source={x:Static SystemParameters.HighContrast}}" Value="False"> 
       <Setter Property="Background" Value="White" /> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Source={x:Static SystemParameters.HighContrast}}" Value="True"> 
       <Setter Property="Background" Value="{Binding Source={x:Static SystemColors.ActiveBorderBrush}}"/> 
      </DataTrigger> 
     </Style.Triggers>