2013-12-17 11 views
0

Я работаю над приложением WPF Xaml. Приложение имеет различные стековые панели (которые ведут себя как значки), что мне нужно изменить видимость на основе определенных критериев.XAML свернуть все дочерние элементы

Вопрос: Как свернуть все дочерние элементы (стековые панели)? Я обрушиваю каждый по одному в бэкэнд в vb.net. Но гораздо лучше найти классный способ сделать это все сразу.

ответ

2

В этом случае вы можете иметь два варианта

  1. вы можете достичь его через стиль (Это не будет работать, если ваш следующий MVVM, то есть, если ваш связывание)
  2. Создать контроль coustom

с стиль:

Написать стиль, как показано ниже с целевым типом, который используется для отображения изображения

<Window.Resources> 
    <Style TargetType="TextBox"> 
     <Setter Property="Visibility" Value="Collapsed"/> 
    </Style> 
    </Window.Resources> 
    <Grid> 
    <StackPanel> 
     <TextBox Height="26" Width="200" Name="text1"/> 
     <TextBox Height="26" Width="200" Name="text2"/> 
     <Button Height="26" Width="200" Click="Button_Click_2" /> 
    </StackPanel> 
    </Grid> 

TextBox по умолчанию будет свернуто вы можете сделать его видимым на основе поиска в коде серверного

Пользовательского контроль:

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

Override скрыть уже существующую видимость свойство со значением по умолчанию разрушилась

+0

ОК, не рассмотрите, что я имел в виду, но я думаю, что я могу подобрать здесь. ваша идея разрушила бы все текстовые поля? я попытаюсь добавить некоторый ключ в элемент, который я хочу скрыть, и пусть xaml обрабатывает хэширование. Спасибо за вашу помощь – CogentP

1

Привязать их с помощью реализации IValueConverter, например BooleanToVisibilityConverter.

Если это не достаточно хорошо, вам придется делать это поодиночке. Может быть, написать обычное поведение?

1

Вы можете установить видимость родителя вместо того, чтобы установить его в каждый элемент управления

Например

<StackPanel> 
     <StackPanel Name="pane1"> 
      <Button Height="30" Width="200" Content="one" Click="Button_Click" /> 
     </StackPanel> 
     <StackPanel Name="panel2"> 
      <Button Height="30" Width="200" Content="two" Click="Button_Click_1" /> 
     </StackPanel> 
    </StackPanel> 

В вас обратно конец написать логику, чтобы установить видимость для StackPanel вместо каждого элемента управления

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     pane1.Visibility = Visibility.Collapsed; 
     panel2.Visibility = Visibility.Visible; 
    } 

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     panel2.Visibility = Visibility.Collapsed; 
     pane1.Visibility = Visibility.Visible; 
    } 

Если ваш следующий mvvm затем привязывается к свойству видимости панели стека, как показано ниже

<StackPanel> 
     <StackPanel Visibility="{Binding CanShowPanel1}"> 
      <Button Height="30" Width="200" Content="one" Click="Button_Click" /> 
     </StackPanel> 
     <StackPanel Visibility="{Binding CanShowPanel2}"> 
      <Button Height="30" Width="200" Content="two" Click="Button_Click_1" /> 
     </StackPanel> 
    </StackPanel> 
+0

это действительно не работает. Если я скрою WrapPanel, иконки внутри будут автоматически скрываться. Но я хочу, чтобы WrapPanel был видимым, поэтому я могу позже выбрать, какие значки показывать и что скрывать. с привязкой его показать все или не показывать ни одной сделки. Я ошибаюсь? – CogentP

+0

не могли бы вы объяснить свое требование примером, тогда было бы легко понять, что вы на самом деле пытаетесь сделать. – Kumareshan

+0

Хорошо. У меня есть WrapPanel, у которого есть куча иконок. Я создаю поле универсального поиска, в котором будут отображаться только значки, связанные с запросом пользователей. Чтобы сделать это, я должен сначала скрыть все значки, а затем показать нужные. Я работаю над тем, чтобы скрыть все значки одним выстрелом, чтобы уменьшить количество кода, который мне нужно написать. – CogentP

0

Самый простой способ сделать это состоит в использовании IValueConverter с параметром.

<StackPanel> 
     <StackPanel Visibility="{Binding TheQuery,Converter={StaticResource QueryConverter,ConverterParameter="MyFirstStackPanelVisible"}}"> 
     </StackPanel> 
     <StackPanel Visibility="{Binding TheQuery,Converter={StaticResource QueryConverter,ConverterParameter="MySecondStackPanelVisible"}}"> 
     </StackPanel> 
    </StackPanel> 


public class QueryConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     switch((string)parameter) 
     { 
      case "MyFirstStackPanelVisible" 
      bool result =CheckQueryCriteriaForFirstStackPanel(); 
      return Visibility.Visible or Visibility.Collapsed; 

      case "MySecondStackPanelVisible" 
      bool result =CheckQueryCriteriaForSecondStackPanel(); 
      return Visibility.Visible or Visibility.Collapsed; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Конечно, вы не должны делать функцию CheckQueryCriteriaFor ... для каждого случая. Этот подход гарантирует логику быть в одном месте.

Смежные вопросы