2016-05-23 3 views
0

Я пытаюсь показать одну свернутую стеквую панель нажатием кнопки, но у меня возникают проблемы, поэтому я попытался изменить свои мысли, и мне удалось свернуть видимую стеквую панель. Но, к сожалению, мне не удалось реализовать поведение, которое я хочу, покажите ручку свернутого стека при нажатии кнопки. К коду: DStackPanel Collapsed and Visible on Button Нажмите

XAML

<Button x:Name="sentButton" Content="Add Friend" Style="{DynamicResource FlatButtonStyle}" Margin="493,0,0,0" HorizontalAlignment="Left" Width="106"/> 
    <StackPanel Style="{DynamicResource stackCollapsed}" Visibility="Collapsed"> 
     <Label Content="Invite Friends" FontWeight="Bold" Margin="0,0,477,0" Height="32" /> 
     <StackPanel Orientation="Horizontal" Margin="26,0,0,0"> 
      <Label Content="Enter your friend's email" Width="222" Height="25" /> 
      <TextBox Text="{Binding Email, UpdateSourceTrigger=PropertyChanged}" Style="{DynamicResource MyTextBox}" x:Name="textBoxEmail" Width="298"/> 
      <Button x:Name="button1" Content="Send" Command="{Binding AddCommand}" Width="77" Style="{DynamicResource FlatButtonStyle}" Margin="20,0,0,0"/> 
     </StackPanel> 
    </StackPanel> 

Стили

<!-- Style Collapsed--> 
<Style x:Key="stackCollapsed" TargetType="StackPanel"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding ElementName=sentButton,Path=IsPressed}" Value="true"> 
      <Setter Property="StackPanel.Visibility" Value="Visible"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 
+0

Вы имеете в виду один раз щелкнуть, чтобы показать второй раз, чтобы скрыть? – dkozl

+0

@dkozl да :) точно. Как Javascript подход, но это для рабочего стола. – Antoine

ответ

2

Вместо ButtonToggleButton использования и связывают StackPanel.Visibility к ToggleButton.IsChecked собственности через BooleanToVisibilityConverter преобразователь

<ToggleButton x:Name="sentButton" Content="Add Friend" Margin="493,0,0,0" HorizontalAlignment="Left" Width="106"/> 
<StackPanel Visibility="{Binding ElementName=sentButton, Path=IsChecked, Converter={StaticResource BooleanToVisibilityConverter}}"> 
    <Label Content="Invite Friends" FontWeight="Bold" Margin="0,0,477,0" Height="32" /> 
    <StackPanel Orientation="Horizontal" Margin="26,0,0,0"> 
     <Label Content="Enter your friend's email" Width="222" Height="25" /> 
     <TextBox Text="{Binding Email, UpdateSourceTrigger=PropertyChanged}" x:Name="textBoxEmail" Width="298"/> 
     <Button x:Name="button1" Content="Send" Command="{Binding AddCommand}" Width="77" Margin="20,0,0,0"/> 
    </StackPanel> 
</StackPanel> 

где конвертер определяется как ниже

<Window.Resources> 
    <ResourceDictionary> 
     <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/> 
    </ResourceDictionary> 
</Window.Resources> 
+0

Спасибо, это сработало :) – Antoine

1

Проблема является Visibility свойство во вкладке <StackPanel> занимает более высокий приоритет, чем что-либо установить в стиле или триггера, так что триггер не будет применяться. См. Dependency Property Precedence List для более подробной информации.

Чтобы исправить текущее решение, переместить свойство Visibliity из <StackPanel> тега и в свой стиль, как это:

<Style x:Key="stackCollapsed" TargetType="StackPanel"> 
    <Setter Property="Visibility" Value="Collapsed"/> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding ElementName=sentButton,Path=IsPressed}" Value="true"> 
      <Setter Property="Visibility" Value="Visible"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

<StackPanel Style="{DynamicResource stackCollapsed}"> 
    ... 
</StackPanel> 

То есть, я бы лично рекомендую что-то вроде кнопка переключения с StackPanel.Visibility границей к ToggleButton.IsChecked, как this answer suggests.

+0

спасибо за ваш ответ, ваш метод работает, но стековая панель не исправлена, это похоже на показ и скрытие (только если я долго нажимаю кнопку) – Antoine

+0

@Antoine Да, это потому, что 'Button.IsPressed' это правда, только когда вы держите мышь на нем. Вот почему 'ToggleButton' - лучший выбор. :) – Rachel