我有一个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?
答案 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;
}
}