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

C# 从子触发器设置父可见属性,c#,wpf,C#,Wpf,我有一个UserControl,用于在DataGrid上显示加载动画。当找到数据时,我结束 通过设置可见性来创建动画。为UserControl折叠。此操作有效 然而,我想能够显示“没有记录发现”的消息了。所以我在UserControl中添加了一个文本框,并绑定了它的可见性属性。当没有数据时,此属性隐藏加载动画(矩形)并显示文本框。当这种情况发生时,我还为TextBox添加了动画 缺少的关键部分是如何将Usercontrol设置回可见。一旦文本框动画结束,就会折叠,这样我就可以在下一次数据搜索中重

我有一个UserControl,用于在DataGrid上显示加载动画。当找到数据时,我结束 通过设置可见性来创建动画。为UserControl折叠。此操作有效

然而,我想能够显示“没有记录发现”的消息了。所以我在UserControl中添加了一个文本框,并绑定了它的可见性属性。当没有数据时,此属性隐藏加载动画(矩形)并显示文本框。当这种情况发生时,我还为TextBox添加了动画

缺少的关键部分是如何将Usercontrol设置回可见。一旦文本框动画结束,就会折叠,这样我就可以在下一次数据搜索中重用整个内容

我的用户控件:

<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>
用户控件在视图中的设置如下:

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


如何将Visible.Collapsed从子文本框触发器设置为parent UserControl?

如前所述,我在代码隐藏中使用情节提要的已完成事件解决了我的问题:

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

在情节提要或其中一个动画(DoubleAnimation、ObjectAnimationUsingKeyFrames)中设置完成的处理程序。在处理程序中,在动画结束时执行所需的操作。此用户控件是自定义控件吗?然后我希望它具有依赖属性,您可以将文本可见性绑定到其他地方。一般建议:查看MVVM,它将使您的软件架构更易于概述和支持。想象一下另一个人,他必须弄清楚文本是如何被某个儿童用户控件隐藏的…@EldHasp,谢谢。这实际上是可行的。我们只希望使用xaml解决方案,但似乎无法实现。@Sinatr,是的,是一个自定义控件。我正在使用MVVM。但在这种情况下,我看不出依赖属性对我有什么帮助。除此之外,只要我的ViewModel中有“No_records”属性,我就不需要依赖性属性-UserControl仍然有效,因为它在同一个视图上,具有相同的DataContext。“我正在使用MVVM”-您不需要:
Get_data()
在视图模型中直接操作控件?还有一点要批评的是,你没有遵循命名准则。我建议您与MVVM专家建立一个联系,以便更好地了解它。
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;
        }
 }