2009-12-17 111 views
8

我有一個擴展器組中的一個擴展器,如何設置它,以便只有擴展器在任何時候都被擴展?WPF-如何讓任何時候只擴展一個擴展器

乾杯

AW

+0

我發現了一個優雅的XAML實現這個需求。單擊[這裏!](http://social.msdn.microsoft.com/forums/en-US/wpf/thread/a2988ae8-e7b8-4a62-a34f-b851aaf13886) – Dabblernl 2010-04-09 19:53:34

+0

404 - 找不到文件或目錄。 http://forums.msdn.microsoft.com/en-US/wpf/thread/a2988ae8-e7b8-4a62-a34f-b851aaf13886#expander_list – schmoopy 2014-12-12 23:48:26

+0

in XAML https://stackoverflow.com/questions/897146/making -a-collection-of-wpf-expanders -extension-exclusive-ie-only-one-expande – 2017-08-24 00:17:17

回答

5

我真的不想這樣做,因爲它需要把代碼(C#)放在窗口文件後面的類中(我試圖完全避免使用ViewModel等)。

理想情況下,我會在XAML中描述這一點。

我迷上了每個擴展器「擴展」事件我很感興趣,並做了以下內容:

private void HandleExpanderExpanded(object sender, RoutedEventArgs e) 
    { 
     ExpandExculsively(sender as Expander); 
    } 

    private void ExpandExculsively(Expander expander) 
    { 
     foreach (var child in findPanel.Children) 
     { 
      if (child is Expander && child != expander) 
       ((Expander)child).IsExpanded = false; 
     } 
    } 

乾杯

AWC

+0

所以,這就是你如何在WinForms這樣的老式框架中完成的。但它不是「WPF方式」,因爲WPF要充分健壯,你想從數據中獲得狀態,而不是從事件中獲取狀態。 – 2009-12-25 18:27:37

+1

我意識到這一點,因此我的意見,但我很高興在代碼背後 – AwkwardCoder 2009-12-28 16:56:06

+1

是你可以隨時把它放在一個列表框 - boooo ---你的方式是更好 - 它不是WPF的方式,但..做..它是錯誤的,使WPF的方式是不正確的! https://social.msdn.microsoft.com/Forums/vstudio/en-US/a2988ae8-e7b8-4a62-a34f-b851aaf13886/windows-presentation-foundation-faq?forum=wpf#expander_list – schmoopy 2014-12-12 23:51:20

1

您可以添加一個依賴屬性,其值爲「即擴大了擴展,」然後你可以綁定「擴展」屬性來表達「theExpandedProperty ==這個」使用你最喜歡的表達式綁定技術(類型轉換器等)。

0

這裏是一個更復雜的方式做到這一點在WPF沒有任何代碼:

<UserControl.Resources> 
    <ResourceDictionary> 
     ... 
     <Style TargetType="{x:Type Expander}"> 
      <Setter Property="IsExpanded" Value="{Binding Path=IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}"/> 
     </Style> 

    </ResourceDictionary> 

</UserControl.Resources> 

<Grid x:Name="LayoutRoot" Background="{x:Null}" Margin="10"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 
    <ScrollViewer VerticalAlignment="Top" HorizontalAlignment="Stretch" VerticalScrollBarVisibility="Auto" VerticalContentAlignment="Top" BorderThickness="0,0,0,0" Grid.RowSpan="1" Grid.Row="0"> 
     <ListBox x:Name="OrdersListBox" BorderThickness="0" ItemContainerStyle="{StaticResource ShellThemeListBoxStyle}" 
       IsSynchronizedWithCurrentItem="True" 
       prism:RegionManager.RegionName="{x:Static uiCommon:RegionNames.WorkSheetsRegion}" Background="#00000000"> 
      <ListBox.ItemTemplate> 
       <DataTemplate DataType="typeData:WorkSheetsDetialsViewModel"> 
        <local:WorkSheetsDetialsView/> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </ScrollViewer> 
    ... 
</Grid> 

<UserControl 
    x:Class="Module.ExcelDocumentManager.WorkSheets.WorkSheetsDetialsView" 
    ...> 
    <Expander> 
     <Expander.Header> 
      <TextBlock Text="{Binding HeaderInfo}" RenderTransformOrigin=".5,.5"> 
      </TextBlock> 
     </Expander.Header> 
     ... 

    </Expander> 
</UserControl>