2015-02-04 1 views
0

아래에 예시 된 설정에서 최근까지 확장기에 나열된 요소 목록이 커지면 (그 길이가 옆에있는 패널의 단추 길이를 초과하므로) 직관적으로 예상대로 데이터 그리드 위에 마우스를 올려 놓습니다. 대신 GUI가 전체 GUI를 수직으로 튀어 오르게합니다.다음 요소 위로 확장기 컨트롤을 가져 오는 방법은 무엇입니까?

<StackPanel> 
    <StackPanel Orientation="Horizontal"> 
    <StackPanel> 
     <Expander>...</Expander> 
    </StackPanel> 
    <StackPanel> 
     <Button ... /><Button ... /><Button ... /> 
    </StackPanel> 
    </StackPanel> 
    <StackPanel Orientation="Horizontal"> 
    <DataGrid ... /> 
    </StackPanel> 
</StackPanel> 

이 문제를 해결하는 한 가지 방법은 모든 것을 동일한 셀의 눈금에 넣고 마지막으로 확장기를 추가하는 것입니다. 그러나, 그것은 저에게 몇몇 수준에 부적당하게 보인다. 대신, 나는 확장기가 손가락이없는 상태로 확장되도록하는 것이 바람직하다 위의 다른 컨트롤. 레이아웃에 영향을 주지만 접힌 상태의 크기에만 영향을줍니다. 확장이 레이아웃에 전혀 영향을주지 않아야합니다.

어리석은 확장기가 그렇게 뻔뻔스럽지 않다고 어떻게 말할 수 있습니까? 참고로

+0

Expander 대신'Popup' 또는'ComboBox'를 사용 해본 적이 있습니까? – Sphinxxx

+0

@Sphinxxx 예. 몇 가지 이유로 확장기 컨트롤이 필요합니다. 사실, 현재로서는, 확장기 변경을 속이는 것보다보기 흉한 방법 (모든 것을 같은 셀에 그리기)을하는 것이 더 쉽습니다. 나는 거기에 구운 일부 기능을 가지고 다시 개발하기 시작 내 피부를 크롤 링 ... 너무 oopsies, 그리고 gotchas을 두려워하게. –

답변

3

,의 원래 XAML에서 StackPanel 요소 번호를하자 :

<StackPanel #1> 
    <StackPanel #2 Orientation="Horizontal"> 
     <StackPanel #3> 
      <Expander>...</Expander> 
     </StackPanel> 
     <StackPanel #4> 
      <Button ... /><Button ... /><Button ... /> 
     </StackPanel> 
    </StackPanel> 
    <StackPanel #5 Orientation="Horizontal"> 
     <DataGrid ... /> 
    </StackPanel> 
</StackPanel> 

StackPanel가장 높은 아이의 그것의 높이를 설정합니다 수평 방향 및 지향 할 때 수직 높이를 설정할 때 그 어린이의 높이가 모두 인 의 합계입니다.

컨트롤을 확장하면 높이가 증가하므로 컨테이너 높이가 증가합니다 (# 3) 이것은 확장기가 버튼을 포함하는 스택 패널 (# 4)보다 큰지 여부에 따라 # 3의 상위 컨테이너 (# 2)의 높이를 증가 시키거나 증가시키지 않을 수 있습니다.

당신이 후 것 같다 효과를 달성하기 위해, 당신은 Grid가 이미 질문과 다른 답변에서 논의 사용할 수 있습니다, 또는 당신은 너무 같은 Canvas 요소를 사용할 수 있습니다

<Window x:Class="..." 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel> 
     <StackPanel Orientation="Horizontal" Panel.ZIndex="1"> 
      <Canvas Width="{Binding ActualWidth, ElementName=Expander}"> 
       <Expander x:Name="Expander" Header="Header" Background="Yellow"> 
        <StackPanel Background="Aqua"> 
         <TextBlock Text="Some text" /> 
         <TextBlock Text="Some text" /> 
         <TextBlock Text="Some text" /> 
         <TextBlock Text="Some text" /> 
         <TextBlock Text="Some text" /> 
         <TextBlock Text="Some text" /> 
        </StackPanel> 
       </Expander> 
      </Canvas> 
      <StackPanel> 
       <Button Content="Button1" /> 
       <Button Content="Button2" /> 
       <Button Content="Button3" /> 
      </StackPanel> 
     </StackPanel> 
     <TextBlock Text="Some more text" Background="LimeGreen" /> 
    </StackPanel> 
</Window> 

캔버스 등을 여기에 사용되어 확장기 컨트롤이 컨테이너의 경계를 벗어날 수 있습니다. 확장자 컨트롤이 바로 아래에있는 요소 (이 예제에서는 TextBlock) 위에 "부동"되게하려면 Panel.ZIndex 속성이 연결됩니다. 캔버스는 자식을 기준으로 크기가 조정되지 않으므로 캔버스의 너비를 확장자의 너비에 바인딩해야합니다. 여기

은 확장기가 붕괴 될 때 보이는 방법은 다음과 같습니다

을 어떻게 그것이 확장 될 때 같습니다

(끔찍한 색상을 용서, 그들은 단지입니다 그래서 컨트롤 경계가 어디 있는지 알 수 있습니다.)

+0

색상이 좋습니다! 무엇이 무엇인지 명확하게 볼 수 있습니다.그래도 이것이 캔버스 컨트롤의 의도 된 목적인지 궁금합니다. 나는 그 목적이 그려지기위한 것이 었음을 알게되었습니다. –

+0

@KonradViltersten WPF Canvas의 목적은 특정 좌표에서 그 자식을 레이아웃하는 것이고, 실제로 그리는 것과 아무 상관이 없습니다. 또한 자식이 기본적으로 경계를 벗어날 수 있도록하는 유용한 속성을 가지고 있습니다. 즉, 자식을 자체 경계에 클립하지 않습니다. 따라서 "겹치는"효과가 필요할 때 자주 사용됩니다. 유사한 레이어링 가능성을 가진 유일한 빌트인 컨트롤은'Grid'이지만, 이것은 더 "heavyweight"패널입니다. –

+0

@KonradViltersten 캔버스가 레이아웃 "슬롯"이고 캔버스에 대한 자식 요소의 위치는 캔버스에 상대적으로 배치된다는 점에서이 캔버스는이 경우 'position : relative; 캔버스의 테두리 바깥에있는 다른 요소를 덮어 씌운다. –

관련 문제