2010-01-25 4 views
1

하나의 열 너비가 * 인 격자가 있습니다. 다른 열은 Auto으로 정의됩니다. * 정의가있는 열은 IScrollInfo을 구현하는 Panel에서 파생 된 사용자 정의 컨트롤을 포함합니다. 이 컨트롤의 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

나는 그다지 의심 스럽지만, 나는 많은 행운이없이 가능한 모든 요소를 ​​무효화하려고 노력했다고 느낍니다. 명확히하기 : 폭을 설정하지 않았습니다. 열 너비는 Auto로 설정되며 repeatbuttons 가시성이 visible로 설정된 경우 크기로 확장되어야합니다. 부모 요소가 모눈이라고 가정합니다. 그리드에서 InvalidateArrange()를 호출하면 CanScrollRight 속성 설정 기에서 아무 효과가 없습니다. – risingape

+0

정확히 어디에서 문제가 귀하의 예제 코드에 놓이는 지 말하기는 어렵지만 작동해야하는 것처럼 보입니다. 이 효과를 얻을 수있는 곳 중 하나가 귀하의 RepeatButton에 콘텐츠가 없다는 것을 볼 수 있습니다. 일반적으로 텍스트는 여기에 있어야합니다. 그렇지 않으면 버튼이 0 너비에 "자동"됩니다. 행운을 빕니다. –

+0

@risingape : 트라이 Q는 일반적으로 기본 버튼 너비가 맞지만 적용 할 수없는 경우가 있습니다. RepeatButtonScrollRight ControlTemplate이 항상 0이 아닌 너비가있는 한 Content가 있는지 여부는 중요하지 않습니다. . –

0

InvalidateArrange은 좋은 대답이지만 불행히도 컨트롤이 실제로 준비되는 동안 무시됩니다. 그래서 트릭은 어레인지가 끝난 후에 그것을 호출하는 것입니다.

이 (내가 그것을 시도하지 않은) 일 수 있습니다

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

를 문제가 해결되지 않으면, 당신은 또한 Dispatcher.BeginInvoke 콜백 내에서 RepeatButton에 InvalidateArrange 및/또는 InvalidateMeasure를 호출 시도 할 수 있습니다 .

관련 문제