2015-12-18 34 views
0

有沒有什麼辦法可以讓HeaderExpander在WPF的可調整大小的窗口中調整最大寬度?看來無論我做什麼,我都無法將內容擴展到最大寬度。它在ExpanderContent部分有效。wpf - 擴展器頭部適合內容寬度?

enter image description here

<Grid Background="LightGray"> 

    <Expander IsExpanded="True"> 
     <Expander.Header> 
       <Grid Width="100" Height="50"> 
        <Rectangle Fill="Red"></Rectangle> 
       </Grid> 
     </Expander.Header> 

     <Rectangle Fill="Red"></Rectangle> 

    </Expander> 

</Grid> 

回答

3

的最快方式是到報頭的寬度結合到整個膨脹的寬度。

<Expander IsExpanded="True"> 
    <Expander.Header> 
     <Grid Width="{Binding RelativeSource={RelativeSource 
      Mode=FindAncestor, 
      AncestorType={x:Type Expander}}, 
      Path=ActualWidth}" 
      Height="50"> 
      <Rectangle Fill="Red"></Rectangle> 
     </Grid> 
    </Expander.Header> 
    <Rectangle Fill="Red"></Rectangle> 
</Expander> 

但它不是一個精確的方法,因爲你有箭頭這也需要一定的空間,你可以看到,標題是比你更需要寬一點。 Changed width for expander's header

您可以覆蓋擴展器標題的標準模板(HeaderTemplate)。

UPDATE

我發現使用the code-behind file(所有學分去@kmatyaszek)一個可能的解決方案。

添加一個輔助類來查找我們需要改變寬度的控件。它檢查父控件的整個可視化樹並返回我們正在尋找的類型的子對象。

public static class VTHelper 
{ 
    public static T FindChild<T>(DependencyObject parent) where T : DependencyObject 
    { 
     if (parent == null) return null; 

     T childElement = null; 
     int childrenCount = VisualTreeHelper.GetChildrenCount(parent); 
     for (int i = 0; i < childrenCount; i++) 
     { 
      var child = VisualTreeHelper.GetChild(parent, i); 
      T childType = child as T; 
      if (childType == null) 
      { 
       childElement = FindChild<T>(child); 
       if (childElement != null) 
        break; 
      } 
      else 
      { 
       childElement = (T)child; 
       break; 
      } 
     } 
     return childElement; 
    } 
} 

添加處理程序以處理加載事件。它改變了ContentPresenter實例的HorizontalAlignment屬性:

private void expander_Loaded(object sender, RoutedEventArgs e) 
{ 
    var tmp = VTHelper.FindChild<ContentPresenter>(sender as Expander); 
    if (tmp != null) 
    { 
     tmp.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch; 
    } 
} 

裝上此處理程序擴展:

<Expander IsExpanded="True" Loaded="expander_Loaded"> 

這種方法使用代碼隱藏,但它不與任何數據的工作(或視圖模型)。它僅改變控件的視覺外觀。

+0

我會怎麼做,要刪除的箭頭?也許這會幫助 – JokerMartini

+0

@JokerMartini檢查更新後的帖子。它顯示了另一種方法,可以在不移除箭頭的情況下解決問題。 –

0

 <Expander Name="myexpander" IsExpanded="True" Margin="0,0,1,0"> 
      <Expander.Header> 
       <Grid Width="{Binding ElementName=myexpander, Path=ActualWidth}" Height="50"> 
        <Rectangle Fill="Red"></Rectangle> 
       </Grid> 
      </Expander.Header> 

      <Rectangle Fill="Red"></Rectangle> 

     </Expander> 

    </Grid> 

提供一個名稱的擴展和綁定width屬性