c# - WPF 导航和旋转背景

标签 c# wpf mvvm

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

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

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

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

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

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

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

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

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

    最佳答案

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

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

    1)ViewModelLocator(不推荐)

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

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

    2)信使(推荐)

    当您的 View 模型或方法中的任何属性更改被执行时,您可以发送一条消息,说明您的 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

    imgur

    关于c# - WPF 导航和旋转背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24221068/

    相关文章:

    c# - INotifyPropertyChanged 没有执行任何操作

    c# - 窗口内弹出窗口 : How to block UI thread?

    wpf - 每次打开 ContextMenu 时如何强制绑定(bind)评估?

    mvvm - avalondock mvvm

    c# - 2 个 XAML 使用相同的 ViewModel 类,但有 2 个单独的实例

    c# - 在 DataGrid 上绑定(bind) View 和 ViewModel

    c# - 如何从存储过程中获取 SQL 字符串结果并将其保存在 C# Windows 应用程序字符串变量中

    c# - 奇怪的跨线程 UI 错误

    c# - 简单的二维火箭动力学

    javascript - 如果已经加载,则阻止 .load() ?