2011-10-05 3 views
1

자, 아래의 설명을 위해 ListBoxItem 하위 클래스와 ListBox 하위 클래스를 만들어 IsItemItsOwnContainerOverrideGetContainerForItemOverride을 모두 재정 의하여 해당 컨테이너로 사용합니다. 윈도우가 처음 나타날 때너비가 변경되었을 때 ListBoxItem이 MeasureOverride를 호출하지 않는 이유는 무엇입니까?

이제 예상대로 MeasureOverride마다 ListBoxItem에서 호출 ArrangeOverride 다음 (인피니티, 무한대로) 모든 항목에서 호출된다. ListBox 크기 조절시

그러나, 단지 ArrangeOverride는 width 속성에 대한 메타 데이터는 AffectsMeasure로 설정하지 MeasureOverride에도 ListBoxItem에 호출된다.

참고 : 나는 그 스크롤 설정에 따라서 자연적으로 다시 것입니다 목록 상자의 폭과 일치하는 항목을 강제하고 있기 때문에 예상대로 MeasureOverride가 호출되는 않는 경우에는 '사용 안 함'으로 ScrollViewer.HorizontalScrollbarVisibility을 설정하여이 문제를 해결받을 수있어 -불. 그러나 나는 여전히 Width 속성의 메타 데이터에 AffectsMeasure 플래그가 설정되어 있고 너비가 ArrangeOverride 단계를 통해 변경되기 때문에 기본적으로 Measure가 기본적으로 호출되지 않는 이유를 파악하려고합니다.

해당 플래그는 해당 컨테이너에 대한 힌트 일 뿐이고 컨트롤이있는 경우 ScrollViewer은 무시됩니다. 내 생각 엔 스크롤을 사용하지 않으면 컨트롤에 사용할 수있는 영역이 무한하기 때문에 일단 측정하면 다시 측정 할 필요가 없습니다. 수평 스크롤을 사용하지 않도록 설정하면 너비가 무제한이 아니므로 MeasureOverride이 다시 호출됩니다. 그러나 그것은 논리적 인 하나 일지라도 단지 추측입니다.

다음은 예제 코드입니다. 새 WPF 프로젝트를 만들고이를 윈도우의 CodeBehind에 붙여넣고 디버그 출력을 살펴보십시오. 그런 다음 HorizontalScrollbarVisibility 플래그를 설정하면 호출되는 것을 볼 수 있습니다.

public partial class MainWindow : Window 
{ 
    public MainWindow(){ 
     InitializeComponent(); 
     var items = new List<object>(){ "This is a really, really, really, really long sentence"}; 
     var lbx = new ListBoxEx { ItemsSource = items }; 
     this.Content = lbx; 
    } 

} 

public class ListBoxEx : ListBox 
{ 
    protected override bool IsItemItsOwnContainerOverride(object item){ 
     return (item is ListBoxItemEx); 
    } 

    protected override DependencyObject GetContainerForItemOverride(){ 
     return new ListBoxItemEx(); 
    } 
} 

public class ListBoxItemEx : ListBoxItem 
{ 
    protected override Size MeasureOverride(Size availableSize){ 
     Console.WriteLine("MeasureOverride called with " + availableSize); 
     return base.MeasureOverride(availableSize); 
    } 

    protected override Size ArrangeOverride(Size finalSize){ 
     Console.WriteLine("ArrangeOverride called with " + finalSize); 
     return base.ArrangeOverride(finalSize); 
    } 

} 

답변

0

좋아, 나는 대답은 측정 패스 패널이 아닌 항목에 영향을 미치고 있기 때문에 발사 아니에요, 그 아이를 다시 측정 할 이유가 없습니다 때문에 패널 자체는 크기가 조정되지라고 생각합니다.

ScrollViewer.HorizontalScrollbarVisibilityDisabled으로 설정하면 패널의 너비가 ListBox의 너비가 아닌 너비를 추적하므로 자식을 다시 측정해야하므로 그럴 수 있습니다.

관련 문제