Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF导航和旋转背景_C#_Wpf_Mvvm - Fatal编程技术网

C# WPF导航和旋转背景

C# WPF导航和旋转背景,c#,wpf,mvvm,C#,Wpf,Mvvm,我正在开发一个应用程序,我正在使用MVVM方法。 基本上,目前有两个页面s和一个主窗口 我使用主窗口内的框架在页面之间切换 在主窗口中,有2个按钮,基本上是全局的,应该显示在所有页面中;x(退出)和设置。 这基本上是我的“外壳”,因为我决定不使用窗口边框 问题是我希望每个页面都有不同的背景,这就是它变得复杂的原因: -设置页面:灰色背景。 -主页:旋转根据属性更改的背景色 问题是背景设置在主窗口中,因为它也应该应用于全局区域(顶部,退出和设置按钮所在的位置) 我首先将背景(在main窗口)设置为

我正在开发一个应用程序,我正在使用MVVM方法。
基本上,目前有两个
页面
s和一个
主窗口

我使用
主窗口内的
框架
在页面之间切换

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

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

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

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

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

到目前为止,我提出了可能的解决方案:

  • MainPage
    中更改属性时,以某种方式导致
    mainpown
    中的绑定更新/刷新
  • 从每个页面内部手动更改背景。(尽管它不是否定了mvvm的概念吗?)
  • 将背景移动到每个页面中,并从那里设置,同时在页面顶部设置全局按钮(如果控件最终重叠,这可能是一件坏事)

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

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

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

1) ViewModelLocator(不推荐)

是包含对所有ViewModel的引用的中心位置。您可以添加一个属性,然后所有viewmodels都使用该属性来获取/设置背景

....
x:Name="Main"
DataContext="{Binding Source={StaticResource Locator}, Path=MainVM}">
....
<Grid Background="{Binding Background, Converter={StaticResource StringBrushConverter}}">
...
您可以在MainViewModel的构造函数中注册此消息:

Messenger.Default.Register<UpdateBackgroundMessage>(this, message =>
    {
        Background = message.Brush;
    });
我知道我在简化这里的事情,但我希望你明白我的意思。即使您决定不使用MVVMLight,这两种方法都是有效的

编辑:

下面是Git回购的例子


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

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

1) ViewModelLocator(不推荐)

是包含对所有ViewModel的引用的中心位置。您可以添加一个属性,然后所有viewmodels都使用该属性来获取/设置背景

....
x:Name="Main"
DataContext="{Binding Source={StaticResource Locator}, Path=MainVM}">
....
<Grid Background="{Binding Background, Converter={StaticResource StringBrushConverter}}">
...
您可以在MainViewModel的构造函数中注册此消息:

Messenger.Default.Register<UpdateBackgroundMessage>(this, message =>
    {
        Background = message.Brush;
    });
我知道我在简化这里的事情,但我希望你明白我的意思。即使您决定不使用MVVMLight,这两种方法都是有效的

编辑:

下面是Git回购的例子


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

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

1) ViewModelLocator(不推荐)

是包含对所有ViewModel的引用的中心位置。您可以添加一个属性,然后所有viewmodels都使用该属性来获取/设置背景

....
x:Name="Main"
DataContext="{Binding Source={StaticResource Locator}, Path=MainVM}">
....
<Grid Background="{Binding Background, Converter={StaticResource StringBrushConverter}}">
...
您可以在MainViewModel的构造函数中注册此消息:

Messenger.Default.Register<UpdateBackgroundMessage>(this, message =>
    {
        Background = message.Brush;
    });
我知道我在简化这里的事情,但我希望你明白我的意思。即使您决定不使用MVVMLight,这两种方法都是有效的

编辑:

下面是Git回购的例子


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

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

1) ViewModelLocator(不推荐)

是包含对所有ViewModel的引用的中心位置。您可以添加一个属性,然后所有viewmodels都使用该属性来获取/设置背景

....
x:Name="Main"
DataContext="{Binding Source={StaticResource Locator}, Path=MainVM}">
....
<Grid Background="{Binding Background, Converter={StaticResource StringBrushConverter}}">
...
您可以在MainViewModel的构造函数中注册此消息:

Messenger.Default.Register<UpdateBackgroundMessage>(this, message =>
    {
        Background = message.Brush;
    });
我知道我在简化这里的事情,但我希望你明白我的意思。即使您决定不使用MVVMLight,这两种方法都是有效的

编辑:

下面是Git回购的例子

我想你应该用它来存储背景。这有多种好处:

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

您可以使用Messenger通知后台属性已更改,以便主窗口或shell可以提取新的后台值并进行更新

我想你应该用它来存储背景。这有多种好处:

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

您可以使用Messenger通知后台属性已更改,以便主窗口或shell可以提取新的后台值并进行更新

我想你