gpt4 book ai didi

c# - 弹出窗口显示一次但不会在动画 WPF 中再次显示

转载 作者:太空狗 更新时间:2023-10-30 01:20:40 27 4
gpt4 key购买 nike

我有一个窗口,右边有 4 个按钮。当我单击其中一个按钮时,我希望显示 4 个弹出窗口中的 1 个。我几乎只完成了第一个,但我遇到了一个我似乎无法弄清楚的绊脚石。由于 4 个弹出窗口需要几乎相同,我决定为 ContentControl 创建一个模板,然后在其中设置我的内容并将内容控件放在弹出窗口中。我的 ContentControl 模板中的一项是关闭按钮。我使用 Storyboard将 IsOpen 属性设置为 false。所以那部分有效。 (这花了很长时间才弄清楚...)但是当我再次单击按钮以打开相同的 Popup 时,它没有显示,我不确定为什么。这是我的 ContentControl 模板

<Style x:Key="PopupContentStyle" TargetType="ContentControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ContentControl">
<Grid>
<Rectangle Fill="WhiteSmoke" Opacity=".50" Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}, Path=Width}" Height="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}, Path=Height}" />
<Button Height="50" Style="{DynamicResource CloseButton}" HorizontalAlignment="Right" VerticalAlignment="Top" >
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames
Storyboard.Target="{Binding RelativeSource={RelativeSource AncestorLevel=1, AncestorType=Popup,Mode=FindAncestor}}"
Storyboard.TargetProperty="(Popup.IsOpen)" Duration="0:0:0">

<DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="False" />
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>

<ContentPresenter />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

尽管这里的Popup 风格并不重要:

<Style x:Key="PopupStyle" TargetType="{x:Type Popup}">
<Setter Property="AllowsTransparency" Value="True"/>
<Setter Property="PopupAnimation" Value="Fade"/>
<Setter Property="Placement" Value="Center"/>
<Setter Property="PlacementTarget" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}"/>
</Style>

在我的 UserControl 中,我有这个 Popup:

<Popup x:Name="popuptest" Opened="popuptest_Opened" Closed="popuptest_Opened" Style="{DynamicResource PopupStyle}" >
<ContentControl Style="{DynamicResource PopupContentStyle}">
<b:BrightnessControl />
</ContentControl>
</Popup>

我用来打开亮度按钮的代码并不复杂:

private void brightButton_Click(object sender, RoutedEventArgs e)
{
popuptest.IsOpen = true;
}

这里还有另外两个来 self 的 xaml 的事件

public event PopupIsOpenedChangedHandler PopupIsOpenedChanged;
public delegate void PopupIsOpenedChangedHandler(bool isOpen);

private void OnPopupIsOpenedChanged(bool isOpen)
{
if (PopupIsOpenedChanged != null)
PopupIsOpenedChanged(isOpen);
}

private void popuptest_Opened(object sender, System.EventArgs e)
{
OnPopupIsOpenedChanged(popuptest.IsOpen);
}

请帮忙:)。哦,我现在只使用 WPF 大约一个月,所以如果你看到我应该改变的东西,一定要提出建议。谢谢。

最佳答案

当动画用于特定属性时,由于优先级列表 (link),只能通过动画进一步分配给属性。引用自MSDN:

In order to have any practical effect, an animation of a property must be able to have precedence over the base (unanimated) value, even if that value was set locally.

来自同一来源:

For an animation, the base value can have an effect on the animated value, if that animation does not specify both "From" and "To" for certain behaviors, or if the animation deliberately reverts to the base value when completed. To see this in practice, run the From, To, and By Animation Target Values Sample. Try setting the local values of the rectangle height in the example, such that the initial local value differs from any "From" in the animation. You will note that the animations start right away using the "From" values and replace the base value once started. The animation might specify to return to the value found before animation once it is completed by specifying the Stop FillBehavior. Afterwards, normal precedence is used for the base value determination.

因此,因此,动画的属性是第一要务,但其他来源(例如代码)则不会指定。

有哪些替代方案?

I. 如文档中所述,使用 FillBehavior="Stop"。由于动画中没有 FromToDuration,因此这不是一个选项。

II.在这两种情况下使用EventTrigger,即:

<EventTrigger SourceName="CloseButton" RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames Storyboard.TargetName="MyPopup"
Storyboard.TargetProperty="(Popup.IsOpen)"
Duration="0:0:0">

<DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="False" />
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>

<EventTrigger SourceName="OpenButton" RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames Storyboard.TargetName="MyPopup"
Storyboard.TargetProperty="(Popup.IsOpen)"
Duration="0:0:0">

<DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True" />
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>

III. 在处理程序中(在代码中),在设置新值之前,移除动画,如下所示:

XAML

<Grid>
<Grid.Triggers>
<EventTrigger SourceName="CloseButton" RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames Storyboard.TargetName="MyPopup"
Storyboard.TargetProperty="(Popup.IsOpen)"
Duration="0:0:0">

<DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="False" />
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Grid.Triggers>

<Popup x:Name="MyPopup" Width="200" Height="200" IsOpen="True">
<Grid Background="Azure">
<Label Content="Test label" />
</Grid>
</Popup>

<Button Name="OpenButton" Content="OpenButtonFromCode" Width="140" Height="30" Click="OpenButton_Click" />
<Button Name="CloseButton" Content="CloseButtonfromEventTrigger" Width="180" Height="30" Margin="0,80,0,0" />
</Grid>

代码隐藏

private void OpenButton_Click(object sender, RoutedEventArgs e)
{
MyPopup.BeginAnimation(Popup.IsOpenProperty, null);
MyPopup.IsOpen = true;
}

关于c# - 弹出窗口显示一次但不会在动画 WPF 中再次显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18344888/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com