2010-01-25 53 views
1

我有一個網格,其中一個列寬定義爲*。 其他列定義爲Auto。 定義了*的列包含從Panel派生的usercontrol,該控件也實現了IScrollInfo。 在此控件的MeasureOverride可見性設置爲在另一列中的RepeatButton上可見(否則RepeatButton的可見性設置爲摺疊)。ColumnDefinition不會擴展,直到調整大小

這不會導致列展開。這隻會在我調整窗口大小時發生。 一個簡單的例子:

<DockPanel LastChildFill="True"> 
    <Grid DockPanel.Dock="Left"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition x:Name="TabItemColumn"/> 
      <ColumnDefinition x:Name="ScrollRightColumn" Width="Auto"/> 
     </Grid.ColumnDefinitions> 
     <ScrollViewer x:Name="PART_ScrollViewer" 
       Grid.Column="0" 
       Margin="-1,0,0,0" 
       Height="32" 
       CanContentScroll="True" 
       VerticalScrollBarVisibility="Hidden" 
       HorizontalScrollBarVisibility="Hidden" 
       HorizontalAlignment="Left"> 
      <local:TabPanel 
        x:Name="tabPanel" 
        HorizontalAlignment="Left" 
        IsItemsHost="True" /> 
     </ScrollViewer> 

     <RepeatButton Style="{StaticResource RepeatButtonScrollRight}" 
      Visibility="{Binding ElementName=tabPanel, Path=CanScrollRight, Converter={StaticResource _localBooleanConverter}}" 
      Grid.Column="1"> 
     </RepeatButton> 

RepeatButton的知名度正確觸發,而據我可以告訴它實際上是渲染,但包含列的ActualWidth是零,直到調整大小。

任何想法?

回答

0

您需要在更改列寬後觸發佈局更改。在適當的父元素上使用InvalidateArrange()。注意避免無限循環。

+0

我很懷疑,但我覺得我已經嘗試過對所有可能的元素無效,沒有多少運氣。爲了澄清:我從不設置寬度。列的寬度設置爲「自動」,並且在repeatbuttons可見性設置爲可見時應擴展爲大小。 我假設父元素是網格。在CanScrollRight屬性設置器中調用Grid上的InvalidateArrange()不起作用。 – risingape 2010-01-25 11:41:57

+0

很難說你的示例代碼中究竟存在哪些問題,但它看起來應該起作用。我可以看到一個可能會產生這種效果的地方,就是您的RepeatButton中沒有任何內容。一般來說,文本應該在這裏,否則按鈕將會是「自動」到0寬度。祝你好運。 – 2010-01-25 14:25:21

+0

@risingape:Tri Q對於默認按鈕寬度來說是正確的,但在您的情況下它可能不適用:只要RepeatButtonScrollRight ControlTemplate的寬度始終爲非零,是否存在內容並不重要。 – 2010-03-03 18:25:40

0

InvalidateArrange是一個很好的答案,但不幸的是,在控件實際安排期間,它被默默忽略。所以訣竅是在安排完成後再打電話給他。

這可能工作(我還沒有嘗試過):

Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => 
{ 
    grid.InvalidateArrange(); 
})); 

如果這不起作用,你可以嘗試打電話InvalidateArrange和/或InvalidateMeasure上的RepeatButton,還內Dispatcher.BeginInvoke回調。

相關問題