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