C# 在工具提示WPF上使用情节提要
我正在尝试创建一个故事板,因此当用户单击文本框时,它会将文本复制到他们的剪贴板,并显示一个工具提示,上面写着“已复制”,然后该提示会消失 以下是我的尝试:C# 在工具提示WPF上使用情节提要,c#,wpf,xaml,C#,Wpf,Xaml,我正在尝试创建一个故事板,因此当用户单击文本框时,它会将文本复制到他们的剪贴板,并显示一个工具提示,上面写着“已复制”,然后该提示会消失 以下是我的尝试: xaml: <TextBox Name="PolyValue" Text="{Binding .}" IsReadOnly="True" BorderThickness="0" Background="White" VerticalAlignment="Center" PreviewMouseDown="CopyText
xaml
:
<TextBox Name="PolyValue" Text="{Binding .}" IsReadOnly="True" BorderThickness="0" Background="White"
VerticalAlignment="Center" PreviewMouseDown="CopyTextBox" >
<TextBox.ToolTip>
<ToolTip Style="{StaticResource TooltipPopupFadeAway}" IsOpen="True" Opacity="0" Background="Transparent" BorderThickness="0">
<Border Background="White" BorderBrush="Black" BorderThickness="1" CornerRadius="3" >
<Label Content="Copied" Padding="5, 2" />
</Border>
</ToolTip>
</TextBox.ToolTip>
</TextBox>
代码隐藏:
private void CopyTextBox(object sender, MouseButtonEventArgs e)
{
if(sender is TextBox textBox)
{
Clipboard.SetText(textBox.Text);
(textBox.ToolTip as ToolTip).IsOpen = false;
(textBox.ToolTip as ToolTip).IsOpen = true; //this recalculates the position
(textBox.ToolTip as ToolTip).Opacity = 1;
}
}
这正是我希望它的工作方式,但是它只工作一次,在它被显示并且用户再次单击之后,什么也没有发生
在CopyTextBox
方法中设置断点后,即使以编程方式将其设置为1,工具提示不透明度的值也为0
我不确定我做错了什么?您应该直接在
IsOpen
属性上触发。确保将默认的Opacity
设置为0
,之后不要将其显式设置为1
<Style x:Key="TooltipPopupFadeAway" TargetType="ToolTip">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Opacity" Value="0"/>
<Setter Property="IsOpen" Value="False"/>
<Style.Triggers>
<Trigger Property="IsOpen" Value="True">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity"
Duration="0:0:1" From="3" To="0"/>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
</Trigger>
</Style.Triggers>
</Style>
这就是我的意思 只绑定text属性意味着不需要代码 我不确定这是否完全符合您的要求,因为您似乎已将previewmousedown显示为工具提示。这对于工具提示来说有点奇怪,因为鼠标悬停会显示它们
<Window.Resources>
<ControlTemplate x:Key="TooltipPopupFadeAway" TargetType="ToolTip">
<Border Background="Yellow">
<TextBlock Text="{Binding PlacementTarget.Text, RelativeSource={RelativeSource AncestorType={x:Type ToolTip}}}"
Name="TheText"
/>
</Border>
<ControlTemplate.Triggers>
<EventTrigger RoutedEvent="ToolTip.Opened">
<BeginStoryboard>
<Storyboard TargetProperty="Opacity">
<DoubleAnimation From="1.0" To="0" Duration="0:0:2" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Window.Resources>
<Grid>
<TextBox>
<TextBox.ToolTip>
<ToolTip Template="{StaticResource TooltipPopupFadeAway}"/>
</TextBox.ToolTip>
</TextBox>
</Grid>
如果它更适合您,您可以通过样式设置模板和工具提示等。我用了一个黄色的背景,所以我可以很容易地看到它。工具提示可能与您的不完全匹配。为什么不绑定到文本并在故事板中淡化不透明度?@Andy您的意思是什么?您可以设置工具提示的模板。在里面放一个文本块。将其文本绑定到文本框中的文本。然后使用故事板将其淡出。如果将
DynamicResource
更改为StaticResource
,则会使代码更高效,因为xaml可以在应用程序运行之前加载到动画中。
private void CopyTextBox(object sender, MouseButtonEventArgs e)
{
if (sender is TextBox textBox)
{
Clipboard.SetText(textBox.Text);
((ToolTip)textBox.ToolTip).IsOpen = false;
((ToolTip)textBox.ToolTip).IsOpen = true;
}
}
<Window.Resources>
<ControlTemplate x:Key="TooltipPopupFadeAway" TargetType="ToolTip">
<Border Background="Yellow">
<TextBlock Text="{Binding PlacementTarget.Text, RelativeSource={RelativeSource AncestorType={x:Type ToolTip}}}"
Name="TheText"
/>
</Border>
<ControlTemplate.Triggers>
<EventTrigger RoutedEvent="ToolTip.Opened">
<BeginStoryboard>
<Storyboard TargetProperty="Opacity">
<DoubleAnimation From="1.0" To="0" Duration="0:0:2" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Window.Resources>
<Grid>
<TextBox>
<TextBox.ToolTip>
<ToolTip Template="{StaticResource TooltipPopupFadeAway}"/>
</TextBox.ToolTip>
</TextBox>
</Grid>