Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使单个方法适用于多个WPF元素_C#_Wpf_Xaml - Fatal编程技术网

C# 使单个方法适用于多个WPF元素

C# 使单个方法适用于多个WPF元素,c#,wpf,xaml,C#,Wpf,Xaml,我制作了一个单击事件/方法,它改变了文本框的不透明度和IsEnabled属性 private void EditButton(object sender, RoutedEventArgs e) { religionTB.IsEnabled = true; DoubleAnimation fade = new DoubleAnimation(1,TimeSpan.FromSeconds(0.2)); religionTB.BeginAnimation(OpacityPr

我制作了一个单击事件/方法,它改变了文本框的不透明度和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项目中,有多个文本框,我想将此方法应用于所有这些文本框,而不必在方法中列出所有文本框。我该怎么做呢?

您可以通过使用
样式来实现这一点。要执行此操作,请转到事件处理程序的上下文(
控件
窗口
)并添加一个
从属属性
,以标记启用模式,并将一个
切换按钮
(编辑按钮)绑定到该属性,该属性设置为启用/禁用控件并触发淡入淡出动画:

在您的控制下:

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中,添加
文本框
样式,并将
切换按钮
链接到
IsedetEnabled

<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>


如果通过删除
x:Key
属性使
Style
隐式化,它将应用于范围内的所有
TextBox
元素

您可以通过使用
Style
实现这一点。要执行此操作,请转到事件处理程序的上下文(
控件
窗口
)并添加一个
从属属性
,以标记启用模式,并将一个
切换按钮
(编辑按钮)绑定到该属性,该属性设置为启用/禁用控件并触发淡入淡出动画:

在您的控制下:

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中,添加
文本框
样式,并将
切换按钮
链接到
IsedetEnabled

<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>


如果通过删除
x:Key
属性使
Style
隐式化,它将应用于范围内的所有
TextBox
元素

如何调用
EditButton
方法?将其签名更改为
void EditButton(Button Button)
?@Clemens:在这种情况下,发送者是一个按钮,而不是一个文本框。如何调用
EditButton
方法?将其签名更改为
void EditButton(Button Button)
?@Clemens:本例中的发送者是一个按钮,而不是一个文本框。奇怪的是,为什么使用依赖属性而不是普通属性?有了这个,我如何将其应用于不同的元素类型,如combobox、文本块、,等等,@Draxalot2只需将
样式的
TargetType
TextBox
更改为
UIElement
。现在,您可以将其应用于任何所需的元素。@BleryEye需要依赖项属性才能绑定到它。由于绑定是双向的
绑定(这里它必须至少是一个
OneWayToSource),因此该属性是一个绑定目标。好奇为什么使用依赖属性而不是普通属性?有了它,我将如何将它应用于不同的元素类型,如combobox、文本块等。@Draxalot2您需要做的就是将
样式的
TargetType
文本框
更改为
UIElement
。现在,您可以将其应用于任何所需的元素。@BleryEye需要依赖项属性才能绑定到它。由于绑定是双向的
绑定(这里它必须至少是一个
OneWayToSource
),因此该属性是一个绑定目标。