자, 아래의 설명을 위해 ListBoxItem
하위 클래스와 ListBox
하위 클래스를 만들어 IsItemItsOwnContainerOverride
및 GetContainerForItemOverride
을 모두 재정 의하여 해당 컨테이너로 사용합니다. 윈도우가 처음 나타날 때너비가 변경되었을 때 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);
}
}