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>