2009-06-24 59 views
3

同步WPF控制寬度我有這種情況下在WrapPanel

<WrapPanel> 
    <CheckBox>Really long name</CheckBox> 
    <CheckBox>Short</CheckBox> 
    <CheckBox>Longer again</CheckBox> 
    <CheckBox>Foo</CheckBox> 
    <Slider MinWidth="200" /> 
</WrapPanel> 

我希望所有的WrapPanel內的複選框是相同的寬度。

添加以下幾乎完成了預期的效果

<WrapPanel.Resources> 
    <Style TargetType="CheckBox" BasedOn="{StaticResource {x:Type CheckBox}}"> 
     <Setter Property="MinWidth" Value="75" /> 
    </Style> 
</WrapPanel.Resources> 

不過,我不想硬編碼特定的寬度,而是讓最大的複選框設置寬度(上述也會失敗如有寬度> 75) 。

滑塊是獨立的,應該被允許比CheckBoxes大。

我不想使用網格(與IsSharedSizeScope),因爲我不想要硬編碼的列數。

This article提出了一個有趣的解決方案,但它很好解決問題,而無需創建自定義控件或使用C#代碼。

這樣做的最佳方式是什麼,最好只在XAML中使用?

+0

我刪除了我的答案,因爲我假設喲意味着沒有網格,如果我寫的第一種方式更適合你,那麼讓我知道,我可以解除它。 – rmoore 2009-06-29 06:21:31

回答

8

我最初看着這個使用IsSharedSizeGroup,但遇到了一個障礙,使它動態適用於事物,而不是顯式包裝物品。在這種情況下,在代碼或其他基於代碼的解決方案中創建AttachedProperty從長遠來看可能比只使用XAML的方法更好。但是,要創建純粹的XAML解決方案,我們可以使用ColumnDefinition上的SharedSizeGroup屬性共享每個元素的大小,然後使用WrapPanel上的IsSharedSizeScope屬性。這樣做將使WrapPanel中具有相同SharedSizeGroup的所有內容共享它們的行寬度和行高度。要包裝當前不在XAML中但將添加到WrapPanel中的ComboBoxes和可能的ComboBoxes,我們可以創建一個Style並重新設置ComboBox的模板,以便將其用網格低級包裝。

<WrapPanel Grid.IsSharedSizeScope="True"> 
    <WrapPanel.Resources> 
    <Style TargetType="{x:Type CheckBox}"> 
     <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type CheckBox}"> 
      <Grid Background="LightBlue"> 
       <Grid.ColumnDefinitions> 
       <ColumnDefinition SharedSizeGroup="WrapPannelGroup" /> 
       </Grid.ColumnDefinitions> 
       <CheckBox Style="{x:Null}" 
         IsChecked="{TemplateBinding IsChecked}"> 
       <!--Other TemplateBindings--> 
       <CheckBox.Content> 
        <ContentPresenter /> 
       </CheckBox.Content> 
       </CheckBox> 
      </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
     </Setter> 
    </Style> 

    </WrapPanel.Resources> 
    <CheckBox>Really long name</CheckBox> 
    <CheckBox>Short</CheckBox> 
    <CheckBox IsChecked="True">Longer again</CheckBox> 
    <CheckBox>Foo</CheckBox> 
    <Slider MinWidth="200" /> 
</WrapPanel> 

在這裏,我們重新模板化所有CheckBox沒有風格WrapPannel裏面改爲複選框按網格包圍。但是,因爲這個原因,我們需要重新綁定所有我們想要維護的CheckBoxes屬性。雖然這可能會變得繁重,但它也允許採用純粹的XAML方法。

1

您可以添加一個屬性或轉換器來完成所需的工作,然後將每個列的寬度綁定到它。屬性或轉換器可以訪問整個項目列表,找到最寬的項目,併爲所有元素返回所需的寬度。

0

這樣做的最好方法是使用CustomControl,就像您發佈的文章一樣。

您遇到的任何解決方案都需要迭代項目列表,並在度量階段找到最大寬度。

任何類型的僅限XAML回答將不得不提供OOTB(例如IsSharedSizeScope),或者將利用某種多重綁定將項目鏈接在一起。因此,任何類型的XAML答案都將充滿標記,這使得它更加冗長(並且不太優雅)。

我看到您發佈的CodeProject文章的唯一修改是添加了「關閉」某些元素(如滑塊)考慮事項的功能。這可以作爲一個附加的財產。