2010-06-04 2 views
2

타원이 포함 된 사용자 정의 컨트롤이 있습니다. 타원은 부분적으로 상위 컨트롤 외부에있을 때까지 오른쪽으로 변환됩니다.부모 열 너비가 GridUnitType.Star로 설정된 경우 Silverlight 클리핑 UserControl

사용자 정의 컨트롤을 3 열 그리드의 중간 열에 넣습니다.

열 너비를 GridUnitType.Auto로 설정하면 타원이 넘치는 것을 볼 수 있습니다. 열 너비를 GridUnitType.Star로 설정하면 타원은 여전히 ​​열을 오버플로하지만 열 너비에 맞게 잘립니다.

GridUnitType.Star를 사용하여 열 너비를 고르게 분산해야하지만 변환 된 내용이 잘리지 않도록하십시오.

아래 샘플 코드를 포함 시켰습니다. 어떤 도움을 주시면 감사하겠습니다.

의 UserControl (타원 함유) (격자 함유)

<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
x:Class="GridWidthTest.UserControl1"> 

<Grid x:Name="LayoutRoot" Background="Green"> 
    <Ellipse Fill="#FFF40404" Stroke="Black" Grid.Column="1" Width="400" Height="400" RenderTransformOrigin="0.5,0.5"> 
     <Ellipse.RenderTransform> 
      <TransformGroup> 
       <TranslateTransform X="200"/> 
      </TransformGroup> 
     </Ellipse.RenderTransform> 
    </Ellipse>   
</Grid> 

부모 제어

<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:GridWidthTest" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
x:Class="GridWidthTest.MainPage" 
Width="640" Height="480" mc:Ignorable="d"> 

<Grid x:Name="LayoutRoot" Background="White"> 

    <Grid ShowGridLines="True"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions>   

     <local:UserControl1 Grid.Column="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/>    
    </Grid>   
</Grid> 

답변

0

이 해결 farily 까다로운 문제이다. 먼저 RenderTransform이 실제로 무엇을하는지 이해하는 것이 중요합니다. 그것은 인 것을 변형시킵니다. 각 픽셀은 궁극적으로 매우 단순한 행렬 계산을 기반으로 새로운 위치로 이동합니다. 이것은 전체 렌더링 프로세스에서 아주 늦게 발생합니다. 타원은 이미 변형이 적용되기 전에 으로 잘립니다. 요소 (타원에서 렌더링하기 위해 400 X 400 상자를 원하는) 요소가 자신의 컨테이너에 의해 말되는 경우 다음 을 준비 자신의 선호하는 조건에서 경쟁

레이아웃 엔진은 두 단계를 통과, 측정 그들이 무엇을 할 수 실제로 가지고있다. 컬럼 너비 "자동"타원 어떠한 클리핑없이 렌더링 폭 (400)의 상자 측정 단계 동안 UserControl 요청에 Grid 수율 인 경우

는 상자 다음RenderTransform 충분히 크기 때문에 결과를 새로운 위치로 변환합니다.

Grid은 열 너비가 "UserControl"보다 작은 경우에도 해당 열 너비의 상자에 의해 결정된 너비의 상자 만 UserControl에 제공합니다. 이 경우 타원은 렌더링되지만 지정된 상자의 테두리로 잘립니다. 그 다음이 잘린 타원은 새로운 위치로 번역됩니다.

주어진 상자에서 벗어날 수 있으려면 요소에 음수 여백을 지정할 수 있습니다. 예를 들어 콘테이너가 너비가 200에 불과하지만 UserControl에 -100 여백이 있으면 실제 렌더링 된 상자의 너비는 400 픽셀입니다.

동적으로 내용을 정렬하는 동안 예상대로 작동하도록하려면 약간의 시행 착오를 거칠 수 있습니다.

1

답장을 보내 주셔서 감사합니다.

난 이제 캔버스에서 타원을 래핑하여이 문제를 해결했습니다. 즉, 클리핑되지 않습니다.

+0

독창적 인! 이것은 잘 작동합니다. – McGarnagle

관련 문제