StackPanel이 주어지면 :
<StackPanel>
<TextBox Height="30">Apple</TextBox>
<TextBox Height="80">Banana</TextBox>
<TextBox Height="120">Cherry</TextBox>
</StackPanel>
자식 요소 자체의 크기가 다르더라도 자식 요소의 간격을 동일하게 유지하는 가장 좋은 방법은 무엇입니까? 개별 어린이 각각에 속성을 설정하지 않고 수행 할 수 있습니까?
답변
컨테이너 내의 범위에 적용된 여백 또는 패딩을 사용하십시오.
<StackPanel>
<StackPanel.Resources>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Margin" Value="0,10,0,0"/>
</Style>
</StackPanel.Resources>
<TextBox Text="Apple"/>
<TextBox Text="Banana"/>
<TextBox Text="Cherry"/>
</StackPanel>
편집 : 두 컨테이너 사이의 여백을 다시 사용하려는 경우 여백 값을 외부 범위의 리소스로 변환 할 수 있습니다.
<Window.Resources>
<Thickness x:Key="tbMargin">0,10,0,0</Thickness>
</Window.Resources>
그런 다음 내부 범위에서이 값을 참조하십시오.
<StackPanel.Resources>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Margin" Value="{StaticResource tbMargin}"/>
</Style>
</StackPanel.Resources>
답변
또 다른 좋은 접근법은 여기에서 볼 수 있습니다 :
http://blogs.microsoft.co.il/blogs/eladkatz/archive/2011/05/29/what-is-the-easiest-way-to-set-spacing-between- 항목 -에 – stackpanel.aspx
> – 링크가 고장 이 webarchive입니다 이 링크의.
첨부 된 비헤이비어를 만드는 방법을 보여 주므로 다음과 같은 구문이 작동합니다.
<StackPanel local:MarginSetter.Margin="5">
<TextBox Text="hello" />
<Button Content="hello" />
<Button Content="hello" />
</StackPanel>
이것은 여백이 같은 유형이 아니더라도 여백을 패널의 여러 자식으로 설정하는 가장 쉽고 빠른 방법입니다. (즉, 버튼, 텍스트 상자, 콤보 상자 등)
답변
Elad Katz의 답변이 향상되었습니다 .
- LastItemMargin 속성을 MarginSetter에 추가하여 마지막 항목을 특별히 처리하십시오.
- 세로 및 가로 목록에서 항목 사이에 간격을 추가하고 목록 끝에서 후행 여백을 제거하는 세로 및 가로 속성으로 간격 첨부 속성 추가
예:
<StackPanel Orientation="Horizontal" foo:Spacing.Horizontal="5">
<Button>Button 1</Button>
<Button>Button 2</Button>
</StackPanel>
<StackPanel Orientation="Vertical" foo:Spacing.Vertical="5">
<Button>Button 1</Button>
<Button>Button 2</Button>
</StackPanel>
<!-- Same as vertical example above -->
<StackPanel Orientation="Vertical" foo:MarginSetter.Margin="0 0 0 5" foo:MarginSetter.LastItemMargin="0">
<Button>Button 1</Button>
<Button>Button 2</Button>
</StackPanel>
답변
당신이 정말로하고 싶은 것은 모든 자식 요소를 감싸는 것입니다. 이 경우 아이템 컨트롤을 사용해야하며 끔찍한 부착물에 의존해서는 안됩니다.
<ItemsControl>
<!-- target the wrapper parent of the child with a style -->
<ItemsControl.ItemContainerStyle>
<Style TargetType="Control">
<Setter Property="Margin" Value="0 0 5 0"></Setter>
</Style>
</ItemsControl.ItemContainerStyle>
<!-- use a stack panel as the main container -->
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<!-- put in your children -->
<ItemsControl.Items>
<Label>Auto Zoom Reset?</Label>
<CheckBox x:Name="AutoResetZoom"/>
<Button x:Name="ProceedButton" Click="ProceedButton_OnClick">Next</Button>
<ComboBox SelectedItem="{Binding LogLevel }" ItemsSource="{Binding LogLevels}" />
</ItemsControl.Items>
</ItemsControl>
답변
Sergey의 답변에 +1. 그리고 모든 StackPanel에 적용하려면 다음을 수행하십시오.
<Style TargetType="{x:Type StackPanel}">
<Style.Resources>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Margin" Value="{StaticResource tbMargin}"/>
</Style>
</Style.Resources>
</Style>
그러나 App.xaml (또는 Application.Resources에 병합 된 다른 사전)에서 이와 같은 스타일을 정의 하면 컨트롤의 기본 스타일을 재정의 할 수 있습니다. 스택 패널과 같은 대부분 보이지 않는 컨트롤의 경우 문제가되지 않지만 텍스트 상자 등의 경우이 문제가 발생 하여 운 좋게도 해결 방법이 있습니다.
답변
Sergey의 제안에 따라 두께 객체 대신 전체 스타일 (여백을 포함한 다양한 속성 설정 기 포함)을 정의하고 재사용 할 수 있습니다.
<Style x:Key="MyStyle" TargetType="SomeItemType">
<Setter Property="Margin" Value="0,5,0,5" />
...
</Style>
…
<StackPanel>
<StackPanel.Resources>
<Style TargetType="SomeItemType" BasedOn="{StaticResource MyStyle}" />
</StackPanel.Resources>
...
</StackPanel>
여기서의 트릭은 암시 적 스타일에 스타일 상속을 사용하고 외부 (아마도 XAML 파일에서 병합 된) 리소스 사전의 스타일에서 상속하는 것입니다.
사이드 노트 :
처음에는 암시적인 스타일을 사용하여 컨트롤의 Style 속성을 외부 스타일 리소스 (예 : “MyStyle”키로 정의)로 설정하려고했습니다.
<StackPanel>
<StackPanel.Resources>
<Style TargetType="SomeItemType">
<Setter Property="Style" Value={StaticResource MyStyle}" />
</Style>
</StackPanel.Resources>
</StackPanel>
https://connect.microsoft.com/VisualStudio/feedback/details/753211/xaml-editor-window-fails에 설명 된대로 CATASTROPHIC FAILURE 오류 (HRESULT : 0x8000FFFF (E_UNEXPECTED))로 인해 Visual Studio 2010이 즉시 종료되었습니다. -재해가 실패 할 때-스타일로 시도 할 때-설정된 스타일의 속성
답변
Grid.ColumnSpacing , Grid.RowSpacing , StackPanel.Spacing 은 이제 UWP 미리보기에 있으며 여기에서 요청한 사항을 더 잘 완료 할 수 있습니다.
이 속성은 현재 Windows 10 Fall Creators Update Insider SDK에서만 사용할 수 있지만 최종 비트로 만들어야합니다!