【发布时间】:2017-03-09 09:09:32
【问题描述】:
问题:
如何以及为什么可以在一个元素上设置Opacity = 1 和Visibility = Visible,然后在运行程序时获取Opacity = 0 和Visibility = Collapsed?
说明:
我有一个我写的问卷库。问题有一个 AnswerRequired 依赖项。
如果 AnswerRequired 设置为 false,则问题会淡出(Visibility=collapsed,Opacity = 0)。
在一个应用程序中,我有一个使用DatePicker 的DateQuestion。
<wpfQuestionnaire:DateQuestion
QuestionNumber="15.2"
AnswerDate="{Binding LastPregnant, Mode=TwoWay}"/>
日期绑定到视图模型上的属性LastPregnant。在设置LastPregnant 时,我还设置了属性PregnantThisYear(使用NodaTime)。
AnswerRequired of 下一个问题绑定PregnantThisYear。当它更新Question_TargetUpdated 时,会调用并更新AnswerRequired 状态列表。调查问卷会收到通知。
<wpfQuestionnaire:BinaryQuestion
QuestionNumber="15.3"
AnswerRequired="{
Binding PregnantThisYear,
NotifyOnTargetUpdated=True,
Mode=TwoWay}"
TargetUpdated="Question_TargetUpdated"/>
所有问题都来自QuestionBase,它具有事件和处理程序AnswerRequiredChanged += OnAnswerRequiredChanged。
OnAnswerRequiredChanged 相应地调用FadeIn 或FadeOut。
FadeIn 看起来像这样:
public void FadeIn(UIElement element)
{
element.Visibility = Visibility.Visible;
var fade = new DoubleAnimation
{
From = 0,
To = 1,
Duration = TimeSpan.FromSeconds(0.5),
FillBehavior = FillBehavior.Stop
};
fade.Completed += delegate
{
element.Opacity = 1;
element.Visibility = Visibility.Visible;
Debug.WriteLine(QuestionNumber + " Visibility : " + Visibility + " | opacity : " + Opacity);
};
Storyboard.SetTarget(fade, element);
Storyboard.SetTargetProperty(fade, new PropertyPath(OpacityProperty));
var sb = new Storyboard();
sb.Children.Add(fade);
sb.Begin();
}
为了调试,我在动画完成时写下问题编号Visibility 和Opacity。以下是我将第一个问题的日期设置为距今天不到一年的日期时的日志示例:
15.1 Visibility : Visible | opacity : 1
15.1 Visibility : Visible | opacity : 1
15.2 Visibility : Visible | opacity : 1
15.2 Visibility : Visible | opacity : 1
15.5 Visibility : Visible | opacity : 1
15.5 Visibility : Visible | opacity : 1
15.3 Visibility : Visible | opacity : 1
注意15.3 有Visibility : Visible | opacity : 1,但它没有出现在程序中,用 Snoop 检查告诉我它有Visibility = Collapsed 和Opacity = 0。
所有其他问题都按预期淡入淡出。
有什么想法吗?
更新
我向IsVisibleChanged += OnVisibleChanged;添加了一个处理程序
private void OnVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
var q = sender as QuestionBase;
if(q.QuestionNumber == "15.3")
Debug.WriteLine(q.QuestionNumber +
" VISIBILITY CHANGED TO " +
e.NewValue +
" | Property :" + e.Property);
}
当它隐藏在初始化时我得到了这个:
15.3 VISIBILITY CHANGED TO False| Property :IsVisible
15.3 Faded Out
设置我得到的日期时:
15.3 Areq changed to : True // from OnAnswerRequiredChanged
15.3 Visibility : Visible | opacity : 1 // from FadeIn
但是OnVisibleChanged 没有被解雇!
我将FadeIn 中的debug.WriteLine 更改为肯定我正在编写element 的内容。
那么我如何在不提高 IsVisibleChanged 的情况下获得 15.3 Visibility : Visible。
【问题讨论】:
-
您是否尝试在 Dependency 属性设置器中设置断点并跟踪其更改?如果 snoop 显示要折叠的值,那么您的绑定属性的值在 xaml 呈现之前的某处已经发生了很大变化
-
请注意,您的调试输出不显示
element.Visibility和element.Opacity,而是显示拥有FadeIn的类的实例的Visibility和Opacity属性的值方法。 -
@Clemens,谢谢。但它们应该是一样的。我用
this调用它。 -
@Jinish,我会尝试在其中设置一些断点。感谢您的建议
标签: c# wpf events data-binding