Сделайте так, чтобы один метод работал для нескольких элементов WPF - PullRequest
1 голос
/ 17 июня 2019

Я создал событие / метод щелчка, который изменяет свойства непрозрачности и свойства IsEnabled текстового поля.

private void EditButton(object sender, RoutedEventArgs e)
{
   religionTB.IsEnabled = true;

   DoubleAnimation fade = new 
   DoubleAnimation(1,TimeSpan.FromSeconds(0.2));
   religionTB.BeginAnimation(OpacityProperty, fade);
}

В моем проекте WPF есть несколько текстовых полей, и я хотел бы применить этот метод ко всем этим текстовым полям без необходимости перечисления всех их в методе.Как бы я пошел по этому?

1 Ответ

0 голосов
/ 17 июня 2019

Вы можете достичь этого, используя Style. Для этого перейдите в контекст вашего обработчика событий (Control или Window) и добавьте DependencyProperty, чтобы отметить включенный режим и привязать ToggleButton (кнопка редактирования) к нему, который устанавливает это свойство включить / отключить элементы управления и запустить анимацию постепенного появления и исчезновения:

В вашем распоряжении:

public static readonly DependencyProperty IsEditEnabledProperty = DependencyProperty.Register(
  "IsEditEnabled",
  typeof(bool),
  typeof(MainWindow),
  new PropertyMetadata(default(bool)));

public bool IsEditEnabled { get { return (bool) GetValue(MainWindow.IsEditEnabledProperty); } set { SetValue(MainWindow.IsEditEnabledProperty, value); } }

В вашем XAML добавьте стиль TextBox и свяжите ToggleButton с IsEditEnabled:

<Window.Resources>
  <Style x:Key="OpacityStyle" TargetType="TextBox">
    <Setter Property="Opacity" Value="0" />
    <Setter Property="IsEnabled" 
            Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}, Path=IsEditEnabled}" />

    <Style.Triggers>
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}, Path=IsEditEnabled}"
                   Value="True">

        <! Fade in animation -->
        <DataTrigger.EnterActions>
          <BeginStoryboard>
            <Storyboard>
              <DoubleAnimation Storyboard.TargetProperty="Opacity"
                                   BeginTime="0:0:0"
                                   From="0"
                                   To="1"
                                   Duration="0:0:0.2" />
            </Storyboard>
          </BeginStoryboard>
        </DataTrigger.EnterActions>

        <! Fade out animation -->
        <DataTrigger.ExitActions>
          <BeginStoryboard>
            <Storyboard>
              <DoubleAnimation Storyboard.TargetProperty="Opacity"
                                   BeginTime="0:0:0"
                                   From="1"
                                   To="0"
                                   Duration="0:0:0.2" />
            </Storyboard>
          </BeginStoryboard>
        </DataTrigger.ExitActions>        
      </DataTrigger>
    </Style.Triggers>
  </Style>
</Window.Resources>

<Grid>
  <StackPanel>
    <ToggleButton x:Name="EditButton" IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}, Path=IsEditEnabled, Mode=TwoWay}" />
    <TextBox x:Name="AnimatedTextBox" Style="{StaticResource TextBoxAnimationStyle}" >
    <TextBox x:Name="AnotherAnimatedTextBox" Style="{StaticResource TextBoxAnimationStyle}" >
    <TextBox x:Name="NonanimatedTextBox" >
  </StackPanel>
</Grid>

Если вы сделаете Style неявным, удалив атрибут x:Key, он будет применяться ко всем TextBox элементам в области действия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...