【问题标题】:WPF, C# Visibility = Visible, Opacity = 1 , element not showingWPF, C# Visibility = Visible, Opacity = 1 , 元素不显示
【发布时间】:2017-03-09 09:09:32
【问题描述】:

问题:

如何以及为什么可以在一个元素上设置Opacity = 1Visibility = Visible,然后在运行程序时获取Opacity = 0Visibility = Collapsed

说明:

我有一个我写的问卷库。问题有一个 AnswerRequired 依赖项。

如果 AnswerRequired 设置为 false,则问题会淡出(Visibility=collapsedOpacity = 0)。

在一个应用程序中,我有一个使用DatePickerDateQuestion

<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 相应地调用FadeInFadeOut

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();
 }

为了调试,我在动画完成时写下问题编号VisibilityOpacity。以下是我将第一个问题的日期设置为距今天不到一年的日期时的日志示例:

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.3Visibility : Visible | opacity : 1,但它没有出现在程序中,用 Snoop 检查告诉我它有Visibility = CollapsedOpacity = 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.Visibilityelement.Opacity,而是显示拥有FadeIn 的类的实例的VisibilityOpacity 属性的值方法。
  • @Clemens,谢谢。但它们应该是一样的。我用this 调用它。
  • @Jinish,我会尝试在其中设置一些断点。感谢您的建议

标签: c# wpf events data-binding


【解决方案1】:

尝试扩展 Mainwindow.xaml 的框架 MinHeight="500" MinWidth="700" 如果您的元素在框架之外,则该元素未显示

【讨论】:

    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 2019-06-12
    • 1970-01-01
    • 2015-12-04
    • 2016-06-18
    相关资源
    最近更新 更多