2015-01-28 5 views
0

내 사용자 정의 컨트롤이 레이아웃 프로세스 중에 HorizontalAlignment 또는 VerticalAlignment을 따르지 않는 것 같습니다. 다음과 같이내 UserControl의 크기가 0 인 이유는 무엇입니까?

나는 정의 된 윈도우 스토어 XAML 사용자 컨트롤이 있습니다

다음과 같이이 ItemsControl에 수평 목록에
<UserControl 
    x:Class="IWalker.Views.PDFPageUserControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:IWalker.Views" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    d:DesignHeight="200" 
    d:DesignWidth="250"> 

    <Image x:Name="ThumbImage"/> 

</UserControl> 

(필자는 페이지 XAML은 간결의 상단에 DECL 하락했다 - 그러나 그것은이다) Windows 스토어 빈 템플릿 :. 당신이 볼 수 있듯이

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <ScrollViewer VerticalScrollMode="Disabled" HorizontalScrollMode="Auto" VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Auto"> 
     <ItemsControl x:Name="SlideStrip"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Horizontal"/> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <local:PDFPageUserControl Margin="0 0 5 0" Height="{Binding Path=ActualHeight, ElementName=SlideStrip, Mode=OneWay}" ViewModel="{Binding}" RespectRenderingDimension="Vertical" /> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </ScrollViewer> 
</Grid> 

, PDFPageUserControl는 ItemsControl에의의 ActualHeight에 바인딩의 높이가에 앉아있을 것입니다있다 이러한 상황이 발생하면, 모든 것이 잘 작동합니다. 그 바인딩을 제거하면 내 사용자 정의 컨트롤은 크기가 0,0입니다.

여기 까다로운 부분이 있습니다. PDFPageUserControl에는 암시 적 크기가 없습니다. Height, Width 또는 둘 다를 설정해야합니다 (위 코드에서 볼 수 있듯이). 그런 다음 PDF 렌더링 코드를 사용하여 올바른 크기의 이미지를 생성하고 표시합니다 (이 모든 기능이 작동합니다).

내 이론은 Windows Store XAML의 자동 레이아웃이 기본적으로 해당 항목이 적합 할 때까지 확장을 시도하지 않는다는 것입니다. 대부분의 컨트롤이 자신의 크기를 결정하고이를 레이아웃 엔진에보고합니다. 그런 다음 레이아웃 엔진이 주변의 레이아웃을 작성하여 구축합니다. Mine은 처음에는 0,0이라고보고하고, 높이를 알기를 기다리면서 시스템에 너비를 알려주거나 그 반대로 알려줍니다. ItemsControl의 StackPannel이 항목이 내부에 맞게 늘리도록 강제하지 않으므로 발생하지 않습니다.

그러나 여기에서는 Grid 나 ScrollViewer와 같이 사용 가능한 모든 공간을 채우기 위해 일부 컨트롤을 확장 할 수 있습니다. 가로 및 세로 맞춤을위한 "늘이기"모드는 레이아웃 엔진에서 사용자를 위해 수행 할 것이라고 생각했습니다. 하지만 그것은 내 UserControl에 대해 작동하지 않는 것처럼 보입니다. 마치 레이아웃 프로세스에 제대로 참여하지 않는 것처럼 말입니다.

내 컨트롤을 수정하여 HorizontalAlignment 및 VerticalAlignment에 따라 사용 가능한 공간을 채우도록 스트레칭 할 수있는 방법이 있습니까?

기본 누락 된 정보/코드가 있으면 여기에 질문하십시오. 물론 추가하겠습니다. 수동으로 업데이트해야합니다 그래서, 변경 알림을 발생시키지 않습니다 - WinRT/XAML에서

답변

1

레이아웃 엔진의 과정에 참여하는 것입니다. 특히 사용자 정의 컨트롤은 MeasureOverride 메서드를 재정의해야합니다. 이것이 끝나면 위의 XAML에서 Height 바인딩을 삭제할 수 있습니다.

MeasureOverride는 사용 가능한 크기를 알려주며 VerticalAlignment 및 HorizontalAlignment와 같은 항목에 따라 다릅니다. 따라서 제안 된 크기에 따라 합리적인 숫자가 나오고 다른 숫자는 NaN이됩니다. 그런 다음 이미지의 크기를 계산하여 돌려 주면됩니다.

그러면 레이아웃 엔진이 내 UserControl의 크기를 조정합니다. SizeChanged 이벤트에 연결하고 그 때마다 이미지를 다시 생성합니다. 결과 코드는 아주 깨끗합니다!

새로운 것들에 대한 한마디주의 사항 - 사용 가능한 크기로 NaN 값을 입력 할 준비가되었는지 확인하십시오.

1

ActualHeight가 바인딩되지 않습니다 https://github.com/gordonwatts/IndicoWalker/tree/master/IWalker/IWalker.Windows/Views : 당신은 또한 여기에 모든 코드를 볼 수 있습니다. 이 질문에 대한 내 DoubleViewModel 대답을 고려 :이 특정 문제에 대한 열쇠를 밝혀

GridView with 2 columns, fill width

+0

작전, 네, 맞습니다. 나는 더 튼튼하기 위해 SizeChanged까지 그걸 갈거야. 나는 실제 높이가 옳다는 것을 구속 할 때 운이 좋았을 것입니다. 하지만 여전히 기본적인 질문에 대답하지 않습니다 : 왜이 ​​사람은 레이아웃에 참여하지 않습니다. – Gordon

관련 문제