2009-08-13 7 views
7

Учитывая очень простой МОФ AppWPF ToolBar Сепаратор сжимается ни к чему, когда внутри StackPanel

<Window x:Class="Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="800"> 
    <Grid> 
     <ToolBar Height="50" > 
      <MenuItem Header="Test1" /> 
      <MenuItem Header="Test2" /> 

      <StackPanel Orientation="Horizontal"> 
       <Separator /> 
       <MenuItem Header="Test3" /> 
       <MenuItem Header="Test4" /> 
       <MenuItem Header="Test5" /> 
      </StackPanel> 
     </ToolBar> 
    </Grid> 
</Window> 

Элемент Сепаратор сжимается ни к чему. Если я поставлю Separator перед началом StackPanel, он появится. Почему это происходит? Есть ли стиль, который можно применить где-нибудь, чтобы избежать этого?

ответ

15

StackPanel меняет ориентацию Separator как-то. Обратите внимание, что если вы явно укажете Separator на ширину в 20 единиц, то Separator будет горизонтальной линией вместо вертикальной линии. Это часть того, что происходит.

Если вы применили LayoutTransform к Separator, он отменяет все, что делает StackPanel.

<Separator> 
    <Separator.LayoutTransform> 
     <RotateTransform 
      Angle="90" /> 
    </Separator.LayoutTransform> 
</Separator> 

Я не понимаю необходимость в StackPanel, хотя.

+0

я связывание видимости StackPanel отключить группы функциональных – kenwarner

+0

Спасибо ... сделал трюк для меня. – el2iot2

+0

На самом деле StackPanel НЕ меняет ориентацию разделителя; по умолчанию разделитель имеет горизонтальную ориентацию. Это ToolBar, который изменяет ориентацию на вертикаль для вас; но вы не получите этого преимущества, если разделитель не является прямым дочерним элементом ToolBar. См. Мой ответ ниже. – stone

2

Панель инструментов смешна о том, что вы положили внутрь. Они становятся забавными, когда все элементы не являются прямыми детьми ToolBar. Элементами группировки являются ToolBarTray (группа панелей инструментов), ToolBar и ToolBarPanel (логическое, для свертывания переполнения). Это то, что хочет WPF:

<Grid> 
    <ToolBarTray> 
     <ToolBar Height="Auto"> 
      <ToolBarPanel Orientation="Horizontal" ToolBar.OverflowMode="AsNeeded"/> 
      <MenuItem Header="Test1" /> 
      <Separator/> 
      <MenuItem Header="Test2" /> 
     </ToolBar> 
     <ToolBar Height="Auto"> 
      <ToolBarPanel ToolBar.OverflowMode="Never"/> 
      <MenuItem Header="Test3" /> 
      <MenuItem Header="Test4" /> 
      <Separator/> 
      <MenuItem Header="Test5" /> 
      <ToolBarPanel ToolBar.OverflowMode="AsNeeded"/> 
      <MenuItem Header="Test6" /> 
      <MenuItem Header="Test7" /> 
     </ToolBar> 
    </ToolBarTray> 
</Grid> 
+0

Разве панели ToolBarPanels не должны содержать MenuItems и Separator? Когда вы это сделаете, Separator по-прежнему получает свою ориентацию. Если в ToolBarPanels не должны содержаться MenuItems, привязка видимости ToolBarPanel не будет отображать/скрывать MenuItems вместе с ним. – kenwarner

4

Сепараторы по умолчанию для горизонтальной ориентации.

Сепараторы, расположенные непосредственно внутри ToolBar, имеют свои стили, потому что панель инструментов отменяет стили по умолчанию для своих элементов. Сепараторы, помещенные в другое место, получают стиль по умолчанию разделителя. Поэтому вам нужно будет стилизовать разделитель самостоятельно, если вы захотите сохранить его внутри StackPanel.

This CodeProject discussion содержит образец кода для этого.

Ссылка: WPF развязал Адама Натаном, стр 117.