从子触发器设置父可见属性

时间:2020-08-28 09:53:49

标签: c# wpf

我有一个UserControl,用于在DataGrid上显示加载动画。找到数据后,我结束 通过设置Visibility.Collapsed为UserControl动画。

但是,我也希望能够显示“找不到记录”消息。因此,我已经在UserControl中添加了一个TextBox并绑定了它的Visibility属性。没有数据时,此属性将隐藏正在加载的动画(矩形),并显示TextBox。发生这种情况时,我还为TextBox添加了动画。

缺少的关键部分是如何将Usercontrol设置回Visible。一旦TextBox动画结束,该控件就会崩溃,以便在以后的数据搜索中可以重用整个控件。

我的用户控件:

<UserControl x:Class="MyProject.LoadingControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:MyProject"
             mc:Ignorable="d" d:DesignHeight="100" d:DesignWidth="110">
          
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
            <StackPanel.Triggers>
                <EventTrigger RoutedEvent="Rectangle.Loaded">
                    <BeginStoryboard>
                        <Storyboard Name="waitingAnimation" RepeatBehavior="Forever">
                            <DoubleAnimation Storyboard.TargetName="R1" BeginTime="0:0:0.05" Storyboard.TargetProperty="Opacity" From=".1" To="1" AutoReverse="True" Duration="0:0:0.3"/>
                            <DoubleAnimation Storyboard.TargetName="R2" BeginTime="0:0:0.1" Storyboard.TargetProperty="Opacity" From=".1" To="1" AutoReverse="True" Duration="0:0:0.3"/>
                            <DoubleAnimation Storyboard.TargetName="R3" BeginTime="0:0:0.15" Storyboard.TargetProperty="Opacity" From=".1" To="1" AutoReverse="True" Duration="0:0:0.3"/>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </StackPanel.Triggers>
                 
            <Rectangle Name="R1" Fill="#FF909595" Opacity=".1" Width="12" Height="8">
                <Rectangle.Style>
                    <Style TargetType="Rectangle">
                        <Setter Property="Visibility" Value="Visible"></Setter>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding No_records}" Value="true">
                                <Setter Property="Visibility" Value="Collapsed"></Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Rectangle.Style>
            </Rectangle>
            <Rectangle Name="R2" Fill="#FF909595" Opacity=".1" Width="12" Height="8" Margin="2,0,0,0">
                <Rectangle.Style>
                    <Style TargetType="Rectangle">
                        <Setter Property="Visibility" Value="Visible"></Setter>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding No_records}" Value="true">
                                <Setter Property="Visibility" Value="Collapsed"></Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Rectangle.Style>
            </Rectangle>
            <Rectangle Name="R3" Fill="#FF909595" Opacity=".1" Width="12" Height="8" Margin="2,0,0,0">
                <Rectangle.Style>
                    <Style TargetType="Rectangle">
                        <Setter Property="Visibility" Value="Visible"></Setter>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding No_records}" Value="true">
                                <Setter Property="Visibility" Value="Collapsed"></Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Rectangle.Style>
            </Rectangle>


            <TextBox Name="txt" Text="No records found" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="16" FontWeight="Bold" FontFamily="Segoe Print" BorderBrush="Black" Padding="3" >
                <TextBox.Style>
                    <Style TargetType="TextBox">
                      
                        <Setter Property="Visibility" Value="Collapsed"></Setter>
                       
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding No_records}" Value="True">
                                <Setter Property="Visibility" Value="Visible"></Setter>
                            </DataTrigger>
                            
                            <Trigger Property="Visibility" Value="Visible">
                                <Trigger.EnterActions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="0" AutoReverse="True" BeginTime="0:0:0" Duration="0:0:1" RepeatBehavior="0:0:4"/>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Duration="0:0:1" BeginTime="0:0:4.5" >
                                                <DiscreteObjectKeyFrame Value="{x:Static Visibility.Hidden}" KeyTime="0:0:1"></DiscreteObjectKeyFrame>
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </Trigger.EnterActions>
                            </Trigger>

                        </Style.Triggers>

                    </Style>
                </TextBox.Style>
            </TextBox>
        </StackPanel>
   
</UserControl>

ViewModel代码:

  private void Get_data()
  {
      //Visible property for my UserControl 
      LoadingControl_visible = Visibility.Visible;

      //Fetching data - asnyc method
      var _data = _procedures.Get_employees().Result;

      if(_data == null)
      {
         return;
      }
      else
      {
          //Set ItemsSource property
          DataGrid_data = _data;

          if (DataGrid_data.Count>0)
          {
              //Records found - hide UserControl 
              LoadingControl_visible = Visibility.Collapsed;
          }
          else
          {
             //Property for showing Textbox inside UserControl - no records found
             No_records = true;
        
          }
       }
    }

用户控件在“视图”中的设置如下:

 <loading_ctl:LoadingControl Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="{Binding LoadingControl_visible}"/>

如何从子TextBox触发器中将Visible.Collapsed设置为父UserControl?

1 个答案:

答案 0 :(得分:0)

如前所述,我使用了故事板的Completed事件解决了我的问题,其代码如下:

public partial class LoadingControl : UserControl
{
        public LoadingControl()
        {
            InitializeComponent();

            var story=(Storyboard)this.FindResource("story");
            story.Completed += new EventHandler(Story_Completed);
        }
       
        private void Story_Completed(object sender, EventArgs e)
        {
            this.Visibility = Visibility.Collapsed;
        }
 }
相关问题