2009-07-01 66 views
20

Khi sử dụng điều khiển Mở rộng WPF, nó sẽ được hiển thị bằng các phím mũi tên "Lên" và "Xuống" mặc định. Có cách nào để che giấu những mũi tên lên và xuống không?Ẩn các Mũi tên cho Điều khiển Mở rộng WPF

UPDATE:

tôi quản lý để loại bỏ các mũi tên bằng cách tạo ra một ControlTemplate nhưng bây giờ khả năng mở rộng đã biến mất cũng:

<ContentPresenter Content="{TemplateBinding Expander.Header}"></ContentPresenter> 
      <ContentPresenter Content="{TemplateBinding Expander.Content}"></ContentPresenter> 



<Expander Template="{StaticResource ExpanderControlTemplate}" IsExpanded="False" Cursor="Hand">    

       <Expander.Header> 
       <Border Style="{StaticResource FeedTitleStyle}"> 
       <DockPanel Width="Auto"> 
        <TextBlock DockPanel.Dock="Left" FontSize="16" Text="IronRuby in Action!" />     
       </DockPanel>   

      </Border>     
       </Expander.Header> 
       <Expander.Content>      
        <TextBlock Text="This is the decriprion!" /> 
       </Expander.Content> 

      </Expander> 

Trả lời

53

Thật không may là ContentPresenter bên trong ExpanderTemplate cho tiêu đề là trong lưới cùng như mũi tên, do đó, chỉ cần đặt HeaderTemplate sẽ không giúp chúng tôi.

Sử dụng Mole chúng ta có thể thấy rằng ToggleButton có hình elip - biểu diễn vòng tròn, đường dẫn - biểu thị mũi tên và ContentPresenter hiển thị những gì bạn đặt cho thuộc tính Tiêu đề.

alt text http://i42.tinypic.com/2ihlzzr.jpg

Bây giờ chúng ta biết cách bố trí thực tế của Expander, có một vài cách để chúng tôi có thể đi về việc sửa đổi nó. Tạo một ControlTemplate hoàn toàn mới cho Expander, hoặc lấy các phần mà chúng ta muốn loại bỏ và loại bỏ chúng.

Cập nhật: Có tổ chức Blend, sau khi tạo Mẫu cho Expander, nó khá nhiều chỉ yêu cầu đi qua và xóa Ellipse và Path từ mỗi kiểu ToggleButton.

<Style x:Key="ExpanderHeaderFocusVisual"> 
    <Setter Property="Control.Template"> 
    <Setter.Value> 
     <ControlTemplate> 
      <Border> 
       <Rectangle SnapsToDevicePixels="true" 
          Margin="0" 
          Stroke="Black" 
          StrokeDashArray="1 2" 
          StrokeThickness="1" /> 
      </Border> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

<Style x:Key="ExpanderDownHeaderStyle" 
     TargetType="{x:Type ToggleButton}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ToggleButton}"> 
       <Border Padding="{TemplateBinding Padding}"> 
        <Grid SnapsToDevicePixels="False" 
          Background="Transparent"> 
         <ContentPresenter SnapsToDevicePixels="True" 
              HorizontalAlignment="Left" 
              VerticalAlignment="Center" 
              RecognizesAccessKey="True" /> 
        </Grid> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
<Style x:Key="ExpanderRightHeaderStyle" 
     TargetType="{x:Type ToggleButton}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ToggleButton}"> 
       <Border Padding="{TemplateBinding Padding}"> 
        <Grid SnapsToDevicePixels="False" 
          Background="Transparent"> 
         <ContentPresenter SnapsToDevicePixels="True" 
              HorizontalAlignment="Center" 
              VerticalAlignment="Top" 
              RecognizesAccessKey="True" /> 
        </Grid> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
<Style x:Key="ExpanderUpHeaderStyle" 
     TargetType="{x:Type ToggleButton}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ToggleButton}"> 
       <Border Padding="{TemplateBinding Padding}"> 
        <Grid SnapsToDevicePixels="False" 
          Background="Transparent"> 
         <ContentPresenter SnapsToDevicePixels="True" 
              HorizontalAlignment="Left" 
              VerticalAlignment="Center" 
              RecognizesAccessKey="True" /> 
        </Grid> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
<Style x:Key="ExpanderLeftHeaderStyle" 
     TargetType="{x:Type ToggleButton}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ToggleButton}"> 
       <Border Padding="{TemplateBinding Padding}"> 
        <Grid SnapsToDevicePixels="False" 
          Background="Transparent"> 
         <ContentPresenter SnapsToDevicePixels="True" 
              HorizontalAlignment="Center" 
              VerticalAlignment="Top" 
              RecognizesAccessKey="True" /> 
        </Grid> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
<Style x:Key="ArrowlessExpanderTemplate" 
     TargetType="{x:Type Expander}"> 
    <Setter Property="Foreground" 
      Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" /> 
    <Setter Property="Background" 
      Value="Transparent" /> 
    <Setter Property="HorizontalContentAlignment" 
      Value="Stretch" /> 
    <Setter Property="VerticalContentAlignment" 
      Value="Stretch" /> 
    <Setter Property="BorderBrush" 
      Value="Transparent" /> 
    <Setter Property="BorderThickness" 
      Value="1" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Expander}"> 
       <Border SnapsToDevicePixels="true" 
         Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}" 
         CornerRadius="3"> 
        <DockPanel> 
         <ToggleButton FontFamily="{TemplateBinding FontFamily}" 
             FontSize="{TemplateBinding FontSize}" 
             FontStretch="{TemplateBinding FontStretch}" 
             FontStyle="{TemplateBinding FontStyle}" 
             FontWeight="{TemplateBinding FontWeight}" 
             Foreground="{TemplateBinding Foreground}" 
             HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" 
             Padding="{TemplateBinding Padding}" 
             VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" 
             FocusVisualStyle="{StaticResource ExpanderHeaderFocusVisual}" 
             Margin="1" 
             MinHeight="0" 
             MinWidth="0" 
             x:Name="HeaderSite" 
             Style="{StaticResource ExpanderDownHeaderStyle}" 
             Content="{TemplateBinding Header}" 
             ContentTemplate="{TemplateBinding HeaderTemplate}" 
             ContentTemplateSelector="{TemplateBinding HeaderTemplateSelector}" 
             DockPanel.Dock="Top" 
             IsChecked="{Binding Path=IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" /> 
         <ContentPresenter Focusable="false" 
              Visibility="Collapsed" 
              HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
              Margin="{TemplateBinding Padding}" 
              x:Name="ExpandSite" 
              VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
              DockPanel.Dock="Bottom" /> 
        </DockPanel> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsExpanded" 
          Value="true"> 
         <Setter Property="Visibility" 
           TargetName="ExpandSite" 
           Value="Visible" /> 
        </Trigger> 
        <Trigger Property="ExpandDirection" 
          Value="Right"> 
         <Setter Property="DockPanel.Dock" 
           TargetName="ExpandSite" 
           Value="Right" /> 
         <Setter Property="DockPanel.Dock" 
           TargetName="HeaderSite" 
           Value="Left" /> 
         <Setter Property="Style" 
           TargetName="HeaderSite" 
           Value="{StaticResource ExpanderRightHeaderStyle}" /> 
        </Trigger> 
        <Trigger Property="ExpandDirection" 
          Value="Up"> 
         <Setter Property="DockPanel.Dock" 
           TargetName="ExpandSite" 
           Value="Top" /> 
         <Setter Property="DockPanel.Dock" 
           TargetName="HeaderSite" 
           Value="Bottom" /> 
         <Setter Property="Style" 
           TargetName="HeaderSite" 
           Value="{StaticResource ExpanderUpHeaderStyle}" /> 
        </Trigger> 
        <Trigger Property="ExpandDirection" 
          Value="Left"> 
         <Setter Property="DockPanel.Dock" 
           TargetName="ExpandSite" 
           Value="Left" /> 
         <Setter Property="DockPanel.Dock" 
           TargetName="HeaderSite" 
           Value="Right" /> 
         <Setter Property="Style" 
           TargetName="HeaderSite" 
           Value="{StaticResource ExpanderLeftHeaderStyle}" /> 
        </Trigger> 
        <Trigger Property="IsEnabled" 
          Value="false"> 
         <Setter Property="Foreground" 
           Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Ngoài ra, chúng tôi có thể tạo AttachedProperty và đặt mũi tên và các phần vòng tròn sẽ được thu gọn thay thế.

Dưới đây là AttachedProperty của chúng tôi:

public class AttachedProperties 
{ 
    #region HideExpanderArrow AttachedProperty 

    [AttachedPropertyBrowsableForType(typeof(Expander))] 
    public static bool GetHideExpanderArrow(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(HideExpanderArrowProperty); 
    } 

    [AttachedPropertyBrowsableForType(typeof(Expander))] 
    public static void SetHideExpanderArrow(DependencyObject obj, bool value) 
    { 
     obj.SetValue(HideExpanderArrowProperty, value); 
    } 

    // Using a DependencyProperty as the backing store for HideExpanderArrow. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty HideExpanderArrowProperty = 
     DependencyProperty.RegisterAttached("HideExpanderArrow", typeof(bool), typeof(AttachedProperties), new UIPropertyMetadata(false, OnHideExpanderArrowChanged)); 

    private static void OnHideExpanderArrowChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 
    { 
     Expander expander = (Expander)o; 

     if (expander.IsLoaded) 
     { 
      UpdateExpanderArrow(expander, (bool)e.NewValue); 
     } 
     else 
     { 
      expander.Loaded += new RoutedEventHandler((x, y) => UpdateExpanderArrow(expander, (bool)e.NewValue)); 
     } 
    } 

    private static void UpdateExpanderArrow(Expander expander, bool visible) 
    { 
     Grid headerGrid = 
      VisualTreeHelper.GetChild(
       VisualTreeHelper.GetChild(
         VisualTreeHelper.GetChild(
          VisualTreeHelper.GetChild(
           VisualTreeHelper.GetChild(
            expander, 
            0), 
           0), 
          0), 
         0), 
        0) as Grid; 

     headerGrid.Children[0].Visibility = visible ? Visibility.Collapsed : Visibility.Visible; // Hide or show the Ellipse 
     headerGrid.Children[1].Visibility = visible ? Visibility.Collapsed : Visibility.Visible; // Hide or show the Arrow 
     headerGrid.Children[2].SetValue(Grid.ColumnProperty, visible ? 0 : 1); // If the Arrow is not visible, then shift the Header Content to the first column. 
     headerGrid.Children[2].SetValue(Grid.ColumnSpanProperty, visible ? 2 : 1); // If the Arrow is not visible, then set the Header Content to span both rows. 
     headerGrid.Children[2].SetValue(ContentPresenter.MarginProperty, visible ? new Thickness(0) : new Thickness(4,0,0,0)); // If the Arrow is not visible, then remove the margin from the Content. 
    } 

    #endregion 
} 

Tôi chỉ đi du lịch trực tiếp vào lưới điện có chứa 'mũi tên và nội dung tiêu đề, thay vì cố gắng tìm ra điều khiển theo tên, vì vậy đây sẽ không hoạt động chính xác như là nếu bạn cũng đang tái tạo mẫu expander thành một cấu trúc khác. Khi chúng ta đã định vị Grid chứa, chúng ta có thể thiết lập Arrow và Circle được thu gọn, và đảm bảo rằng Header Content được di chuyển từ bên trái sang bên trái.

Để sử dụng tài sản gắn liền chúng ta chỉ có thể thiết lập nó trên các phần tử trong XAML:

<StackPanel> 
    <Expander x:Name="uiExpander" 
       local:AttachedProperties.HideExpanderArrow="True"> 
     <Expander.Header> 
      <Border> 
       <DockPanel Width="Auto"> 
        <TextBlock DockPanel.Dock="Left" 
           FontSize="16" 
           Text="IronRuby in Action!" /> 
       </DockPanel> 
      </Border> 
     </Expander.Header> 
     <Expander.Content> 
      <TextBlock Text="This is the decriprion!" /> 
     </Expander.Content> 
    </Expander> 

    <Button Content="Click to Show/Hide Expander Arrow" 
      Click="Button_Click" /> 

</StackPanel> 

Và trong mã:

void Button_Click(object sender, RoutedEventArgs e) 
{ 
    uiExpander.SetValue(
     AttachedProperties.HideExpanderArrowProperty, 
     !(bool)uiExpander.GetValue(AttachedProperties.HideExpanderArrowProperty)); 
} 
+0

tạo ảnh vui nhộn người đàn ông trả lời! Và cũng nhờ có công cụ Mole mà tôi không biết về Mole! – azamsharp

+1

+1 cho câu trả lời chắc chắn chưa thu hút sự chú ý hoặc đại diện xứng đáng. :) –

+0

Có cách nào để liên kết IsEnabled của mũi tên với giá trị boolean không, tôi đang tìm một giải pháp gọn gàng, nếu không có bất kỳ thứ gì tôi sẽ từ bỏ nó. – Shimmy

Các vấn đề liên quan