2012-10-12 3 views
1

다음은 UserControl을 포함하는 WPF 창입니다. UserControl은 간단한 너비가없는 2 열의 Grid입니다. 첫 번째 열에서는 간단한 TextBox을 가로로 늘이기로 설정했습니다. 두 번째 열은 비어 있습니다.ColumnDefinitions의 너비가 동적 일 때 WPF가 원하지 않는 여백을 만듭니다?

윈도우의 너비를 줄이면 WPF는 내 오른쪽 UserControl의 거대한 빈 공간을 사용할 수 있지만 작도합니다! 그것은 내 두 번째 열이 비어있는 경우에도 내 첫 번째 열과 같은 크기로 보이지만 이상한, 내 UserControl 외부에서 발생합니다 (그렇지 않으면 빈 공간이 분홍색 것입니다 ...)

MainWindow .XAML :

<Window x:Class="WPF_Grid_Test.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WPF_Grid_Test" 
    Title="MainWindow" Height="350" Width="525"> 
    <local:TestUserControl HorizontalAlignment="Left"/> 
</Window> 

UserControl.XAML : 나는 모든 Margins 및 0-Paddings, 아니 설정 변경 시도

<UserControl x:Class="WPF_Grid_Test.TestUserControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Background="Pink" Height="100"> 
    <Grid Margin="0" ShowGridLines="True"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 
     <TextBox Text="Why is WPF cropping me even though there's a huge blank space to eat into?" VerticalAlignment="Center" /> 
    </Grid> 
</UserControl> 

.

UserControl이 (왼쪽 대신에) 가운데로 설정되면 의 동작이 더 이상합니다! 오른쪽에 큰 여백을 만드는 대신 마진은 실제로 왼쪽과 오른쪽에 균등하게 배분됩니다. 내 UserControl의 동적 크기 조정은 WPF가 사용 가능한 공간을 모두 사용한 후에 발생합니다. 어떤 프로그래머가 기대하는 것이 아닌가?

(내 실제 프로젝트는 실제로 각각 TextBlock에, 텍스트 상자와 버튼을 포함하는 3 열을 가지고 있지만 동작은 동일합니다 : WPF가 자신의 자동 생성 마진에 먹는 전에 UiElements의가립니다)

열 (즉, "자동")에 명확한 너비를 설정하면 WPF는 UserControl을 자르기 전에 해당 공백을 제거합니다. 그러나이 WPF 창 축소되면 UserControl 축소 할 수 없습니다.

내 첫 번째 질문은 이 WPF 버그가 아닙니까?

내 두 번째 질문, 방법 WPF는 그것을 표시 할 공간이 부족 정말을 일단 내 UserControl을 크기를 조정 시작되도록 열이 설정에?

이것은 .NET 4.0입니다. 비슷한 질문은 here이지만 실제로 해결책을 이해하지 못합니다.

업데이트 : 여기에 UserControl에 대한 또 다른 샘플 코드가 있습니다. 열 너비를 설정할 때 공간이 정말 부족하면 제안 "자동"을 UserControl는 윈도우가 수축 될 때 요소를 축소 중지하고 결국 오른쪽 요소를 잘라냅니다 :

<UserControl x:Class="WPF_Grid_Test.TestUserControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Background="Pink" Height="100"> 

    <Grid Margin="0" ShowGridLines="True"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition Width="Auto"/> 
     </Grid.ColumnDefinitions> 
     <TextBox Text="Resize us" VerticalAlignment="Center" Grid.Column="0" /> 
     <TextBox Text="only when" VerticalAlignment="Center" Grid.Column="1" /> 
     <TextBox Text="you're out of space!" VerticalAlignment="Center" Grid.Column="2" /> 
    </Grid> 
</UserControl> 

동작을 내가 노력하고있어 달성하기 위해 UserControl은 창을 축소 할 때 DesiredSize을 유지합니다. 그러나 은 창문이 빈 공간이 없을 때만입니다. UserControl은 "축소"처리를 받아야합니다.

ColumnDefinitions에서 Width=Auto을 제거하려고하면 오른쪽 끝에있는 요소의 크기가 어떻게 조정되는지 확인해야합니다. 전에 컨테이너에 공간이 부족합니다. 이것이 이것이 실제로 WPF 레이아웃 버그라고 생각하는 이유입니다.

답변

2

명시 적으로 열의 너비를 지정해야합니다.

예를 들어 두 열을 항상 같은 크기로 만들려면 Width="*"을 사용하십시오.
두 열 모두 필요한만큼 넓게하려면 Width="Auto"을 사용하십시오. 그러면 크기가 다른 열로 연결됩니다.
한 열을 필요한만큼 넓게 만들고 다른 열을 나머지 공간을 사용하려면 첫 번째 열에서는 Width="Auto"을, 두 번째 열에서는 Width="*"을 사용하십시오.

+0

이 값을 설정하면 내용에 따라 UserControl에 고정 너비가 부여됩니다. 이는 찾고자하는 동작이 아닙니다. UserControl 자체 크기를 조정하고 공간이 부족할 때 해당 요소를 자르기로 괜찮습니다. 위의 코드를 시도해 보면 Container *가 그것을 보여줄 수있는 공간을 가지고 있음에도 UserControl이 축소되었음을 알 수 있습니다. – Joe

+0

나는 당신의 아이디어로 나의 초기 게시물을 업데이트하고 예상되는 동작을 제공하지 못하는 방법을 설명했다. – Joe