C# WPF中运行时属性更改后的外观不正确

C# WPF中运行时属性更改后的外观不正确,c#,wpf,C#,Wpf,我在WPF应用程序中遇到了这个问题,当控件的属性发生更改时,它们不会被可视化地刷新!我正在使用snoop,我可以看到属性设置正确,但它不会影响控件。我注意到,如果我更改了大小,它会刷新并更正控件的外观 此应用程序有多个页面(继承页面的控件),并且有导航栏可导航到每个页面。菜单中有一个选项,允许用户更改控件的可视属性(“FlowDirection”),这将调用一个方法,加载一个资源字典,为整个框架元素应用新样式。我注意到,如果用户更改它(通过使用该菜单项),页面中显示的所有控件都会刷新,并且工作正

我在WPF应用程序中遇到了这个问题,当控件的属性发生更改时,它们不会被可视化地刷新!我正在使用snoop,我可以看到属性设置正确,但它不会影响控件。我注意到,如果我更改了大小,它会刷新并更正控件的外观

此应用程序有多个页面(继承页面的控件),并且有导航栏可导航到每个页面。菜单中有一个选项,允许用户更改控件的可视属性(“FlowDirection”),这将调用一个方法,加载一个资源字典,为整个框架元素应用新样式。我注意到,如果用户更改它(通过使用该菜单项),页面中显示的所有控件都会刷新,并且工作正常。但是当我们导航到其他页面时,一些控件被刷新,而其中一些则没有!(正如我前面提到的,我使用了snoop,它显示为所有其他页面中控件的属性设置了正确的值,如果我调整页面大小,它们将进入正确的位置)

我尝试了InvalidateVisual、InvalidateArrange和InvalidateMeasure,但都没有效果

代码在WPF C#,.NET 4.0中


有什么建议吗?

如果使用绑定,则需要使用DependencyProperties,或者确保在代码中实现INotifyPropertyChanged,并且每当属性更改时,都需要调用OnPropertyChanged(“PropertyName”),其中“PropertyName”是属性的名称,OnPropertyChanged是INotifyPropertyChanged接口的实现(如下所示)

#region INotifyPropertyChanged Members

public event PropertyChangedEventHandler PropertyChanged;

public void OnPropertyChanged(string prop)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(prop));
    }
}

#endregion

如果您发布一些代码来显示控件是如何编写和绑定的,以及ViewModel类是如何编写的,这将有所帮助。听起来,当属性发生更改时,您的VM类没有正确地发出通知,但如果没有示例代码,则无法确定。我在更新属性时遇到了一个问题,但UI没有,最后我通过以低于正常值的
DispatcherPriority
运行代码来解决了这个问题。也许这对你有用?谢谢你的回复,导航真的很复杂(它基于一个定制的框架系统和这么多涉及的组件),我试图通过创建一个简单的解决方案来模拟这个问题,但由于它是如此复杂,我发现在短时间内几乎不可能做到这一点(我的意思是这需要一个多星期!)我还没有写代码,但我可以解释一下,在这种情况下没有手动绑定,有两套样式(作为资源字典)(根据所选选项设置FrameworkElement和一些内置控件(如网格和文本块)的FlowDirection属性(从菜单)将加载这些集合中的一个。这里没有视图模型,它只是一个没有行为的可视控件,它只是在其中显示一些内容。正如我提到的,snoop显示属性设置正确,因此更改选项后,属性获得正确的值,这意味着资源加载正确(正如我所提到的,同一页中还有一些其他控件工作正常)感谢您的回复,但事实并非如此。property是一个UIFrameworkElement属性的FlowDirection(因此它本质上是一个dp),并且没有任何东西可以明确地分配它,它是通过加载资源字典间接设置的。