Oracle обеспечивает утилиту, названную tnsping
:
R:\>tnsping someconnection
TNS Ping Utility for 32-bit Windows: Version 9.0.1.3.1 - Production on 27-AUG-20
08 10:38:07
Copyright (c) 1997 Oracle Corporation. All rights reserved.
Used parameter files:
C:\Oracle92\network\ADMIN\sqlnet.ora
C:\Oracle92\network\ADMIN\tnsnames.ora
TNS-03505: Failed to resolve name
R:\>
R:\>tnsping entpr01
TNS Ping Utility for 32-bit Windows: Version 9.0.1.3.1 - Production on 27-AUG-20
08 10:39:22
Copyright (c) 1997 Oracle Corporation. All rights reserved.
Used parameter files:
C:\Oracle92\network\ADMIN\sqlnet.ora
C:\Oracle92\network\ADMIN\tnsnames.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (COMMUNITY = **)
(PROTOCOL = TCP) (Host = ****) (Port = 1521))) (CONNECT_DATA = (SID = ENTPR0
1)))
OK (40 msec)
R:\>
Это должно показать, какой файл Вы используете. Утилита находится в каталоге Oracle bin
.
Вы можете сделать это с помощью анимации, которая автоматически переворачивается и повторяется (это для Silverlight):
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Blinker.MainPage"
Width="640" Height="480" Loaded="UserControl_Loaded">
<UserControl.Resources>
<Storyboard x:Name="Blink" AutoReverse="True" RepeatBehavior="Forever">
<ColorAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="ellipse"
Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)">
<EasingColorKeyFrame KeyTime="00:00:01" Value="Gray"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White">
<Ellipse x:Name="ellipse" Fill="Green" Stroke="Black"/>
</Grid>
</UserControl>
, а затем запускать анимацию при загрузке элемента управления или при установке свойства - вы не требуется свойство зависимостей, если вы не
private bool blinking;
public bool IsBlinking
{
get
{
return blinking;
}
set
{
if (value)
{
this.Blink.Begin();
}
else
{
this.Blink.Stop();
}
this.blinking = value;
}
}
или при запуске:
private void UserControl_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
this.Blink.Begin();
}
Вот еще один способ сделать это в WPF - используя VisualStateManager - который также будет работать в Silverlight:
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="BlinkerApp.Blinker"
x:Name="UserControl"
d:DesignWidth="100" d:DesignHeight="100">
<Grid x:Name="LayoutRoot">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="BlinkStates">
<VisualState x:Name="Blinking">
<Storyboard AutoReverse="True" RepeatBehavior="Forever">
<ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="ellipse" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)">
<SplineColorKeyFrame KeyTime="00:00:01" Value="Gray"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Stopped"/>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Ellipse x:Name="ellipse" Fill="Green" Stroke="Black"/>
</Grid>
, а затем иметь переключатель свойства IsBlinking визуальное состояние:
namespace BlinkerApp
{
using System.Windows;
using System.Windows.Controls;
/// <summary>
/// Interaction logic for Blinker.xaml
/// </summary>
public partial class Blinker : UserControl
{
private bool blinking;
public Blinker()
{
this.InitializeComponent();
}
public bool IsBlinking
{
get
{
return blinking;
}
set
{
if (value)
{
VisualStateManager.GoToState(this, "Blinking", true);
}
else
{
VisualStateManager.GoToState(this, "Stopped", true);
}
this.blinking = value;
}
}
}
}
Чтобы обеспечить больший контроль над частотой мигания и тому подобное в вашем коде, я бы предложил иметь перенаправленное событие в вашем UserControl под названием Blink:
public static readonly RoutedEvent BlinkEvent = EventManager.RegisterRoutedEvent("Blink", RoutingStrategy.Direct, typeof(RoutedEventHandler), typeof(LedControl));
public event RoutedEventHandler Blink
{
add { AddHandler(BlinkEvent, value); }
remove { RemoveHandler(BlinkEvent, value); }
}
В вашем коде позади вы можете установить включите таймер, чтобы инициировать событие, как хотите часто (это также дает вам возможность мигать светом один раз, когда вы хотите:
RaiseEvent(new RoutedEventArgs(LedControl.Blink));
Теперь в XAML следующий код сделает свечение видимым и установит свойство fill эллипса (ledEllipse) в ярко-зеленый радиальный градиент, затем верните значение заливки тусклому «неосвещенному» зеленому (который вы можете изменить на серый, если хотите). Вы можете просто изменить продолжительность, чтобы мигание длилось дольше.
<UserControl.Triggers>
<EventTrigger RoutedEvent="local:LedControl.Blink">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="glow"
Storyboard.TargetProperty="Opacity"
To="100"
AutoReverse="True"
Duration="0:0:0.075" />
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ledEllipse"
Storyboard.TargetProperty="Fill"
Duration="0:0:0.15">
<ObjectAnimationUsingKeyFrames.KeyFrames>
<DiscreteObjectKeyFrame KeyTime="0:0:0.01">
<DiscreteObjectKeyFrame.Value>
<RadialGradientBrush>
<!--bright Green Brush-->
<GradientStop Color="#FF215416" Offset="1"/>
<GradientStop Color="#FE38DA2E" Offset="0"/>
<GradientStop Color="#FE81FF79" Offset="0.688"/>
</RadialGradientBrush>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
<DiscreteObjectKeyFrame KeyTime="0:0:0.15" >
<DiscreteObjectKeyFrame.Value>
<RadialGradientBrush>
<!--dim Green Brush-->
<GradientStop Color="#FF21471A" Offset="1"/>
<GradientStop Color="#FF33802F" Offset="0"/>
<GradientStop Color="#FF35932F" Offset="0.688"/>
</RadialGradientBrush>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames.KeyFrames>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</UserControl.Triggers>
Кроме того, я напрямую ссылаюсь на эллипс ledEllipse и соответствующий ему DropShadowEffect «свечение».которые определены в ledControl следующим образом (redLight - это просто еще одна кисть с радиальным градиентом, с которой я запускаю свойство fill моего светодиода):
<Ellipse x:Name="statusLight" Height="16" Width="16" Margin="0" Fill="{DynamicResource redLight}" >
<Ellipse.Effect>
<DropShadowEffect x:Name="glow" ShadowDepth="0" Color="Lime" BlurRadius="10" Opacity="0" />
</Ellipse.Effect>
</Ellipse>
Примечание. DropShadowEffect был введен в .Net 3.5, но вы можете удалить его, если не хотите эффект свечения (но он хорошо смотрится на сплошном контрастном фоне).