【问题标题】:WPF Navigation and Rotating BackgroundsWPF 导航和旋转背景
【发布时间】:2014-06-24 16:12:20
【问题描述】:

我正在开发一个应用程序,并且正在使用 MVVM 方法。
基本上,目前有两个Pages,和1个MainWindow
我使用MainWindow 内的Frame 在页面之间切换。

在主窗口中,有2个按钮,基本上是全局的,应该在所有页面中显示; x(退出)和设置。
这基本上是我的“外壳”,因为我决定不使用窗口边框。

问题是我希望每个页面都有不同的背景,这就是它变得复杂的地方:
- 设置页面:灰色背景。
- 主页:根据属性改变的旋转背景颜色。

背景是在主窗口中设置的,因为它也应该应用于全局区域(顶部,退出和设置按钮所在的位置)。

我首先将背景(在MainWindow 中)设置为绑定到代表当前页面的属性(然后在转换器的帮助下将该值转换为颜色十六进制代码)。

总而言之,这会导致当页面更改时背景会更改,但MainPage 中的属性更改时不会更改。我可以清楚地理解为什么,但我不知道如何解决它。

目前我想出的可能解决方案:

  • MainPage 中的属性更改时,不知何故导致MainWindow 中的绑定更新/刷新。
  • 从每个页面内手动更改背景。 (虽然不是否定了 mvvm 的思想吗?)
  • 将背景移动到每个页面并从那里进行设置,同时在页面顶部制作全局按钮(如果控件最终重叠,这可能是一件坏事)。

如果是这样,这个问题的最佳解决方案是什么?

【问题讨论】:

  • 为什么不让页面背景透明?所以他们实际上显示了MainWindow的背景?
  • 它们是透明的。它们确实显示了MainWindow 的背景,但我希望该背景同时通过当前页面和页面内的属性进行更改。
  • 嘿@xTCx,我用工作示例更新了我的答案。希望对您有所帮助!

标签: c# wpf mvvm


【解决方案1】:

如果您还没有,我建议您通过 NuGet 安装一些软件包,以使 MVVM 风格的开发更加愉快。我个人更喜欢MVVMLight,它......嗯,很轻,但它也包含很多有用的功能。

要在 ViewModel 之间进行通信,您有(至少)两种可能的方法。

1) ViewModelLocator(不推荐)

ViewModelLocator 是保存对所有视图模型的引用的中心位置。您可以添加一个属性,然后所有视图模型都使用该属性来获取/设置背景。

....
x:Name="Main"
DataContext="{Binding Source={StaticResource Locator}, Path=MainVM}">
....
<Grid Background="{Binding Background, Converter={StaticResource StringBrushConverter}}">
...

2) 信使(推荐)

当您的视图模型或方法中的任何属性更改被执行时,您可以发送一条消息,说明您的 MainViewModel 已注册监听。发送消息就像...一样简单

Messenger.Default.Send(new UpdateBackgroundMessage(new SolidColorBrush(Colors.Blue)));

你会在 MainViewModel 的构造函数中注册这条消息:

Messenger.Default.Register<UpdateBackgroundMessage>(this, message =>
    {
        Background = message.Brush;
    });

实际的消息类别是:

public class UpdateBackgroundMessage : MessageBase
{
    public UpdateBackgroundMessage(Brush brush)
    {
        Brush = brush;
    }
    public Brush Brush { get; set; }
}

我知道我在这里简化了一些事情,但我希望你明白这一点。 即使您决定不使用 MVVMLight,这两种方法都有效

编辑:

这是带有示例的 Git 存储库 https://github.com/mikkoviitala/cross-viewmodel-communication

【讨论】:

  • 谢谢!我想我会采用信使方法,对我来说似乎更直观。我还将检查 MVVMLight。顺便说一句,感谢您设置示例项目!!! :)
【解决方案2】:

我认为你应该使用Application Properties 来存储背景。这有很多好处:

1) 全球可用 2) 易于记忆或存储用户偏好 3) 自动为每个用户维护单独的配置文件,因为它将值存储在用户的 AppData 文件夹中。

您可以使用 Messenger 通知背景属性已更改,以便主窗口或外壳可以提取新的背景值并更新它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多