WPF MVVM 应用程序中的启动画面
Splash screen in WPF MVVM application
我有一个 MVVM WPF 应用程序,当完成一些较长的任务时,我会从中显示启动画面。
这个启动画面是一个典型的 WPF window,非常简单,它只有一个标签来显示自定义文本,例如 "Loading..." 和一个微调框。
它的代码隐藏只有构造函数,其中它只执行 InitializeComponent 和事件 Window_Loaded。
在我的主要 MVVM WPF 应用程序中,当我执行一项较长的任务时,我会实例化此 window 并显示启动画面。
所以现在,我想自定义启动画面中标签中显示的文本。那么最好的方法是什么?
我所做的是在实例化 window(启动画面)时将字符串(自定义消息)作为参数传递给构造函数。
Window mySplash = new SplashScreen("Loading or whatever I want");
由于这个启动画面非常简单,只有一个启动画面,我认为在这里应用 MVVM 没有任何意义,所以在代码隐藏中我创建了一个私有 属性 并设置了传递的字符串作为构造函数的参数。然后,我将视图中的标签与此私有 属性 绑定,最后在代码隐藏(视图)中实现 INotifyPropertyChanged。这里没有模型,模型视图
这是正确的做法吗?或者还有其他方法吗?
我知道还有其他解决方案,例如通过添加以下内容使 public 成为视图中的标签:
x:FieldModifier="public"
然后在我实例化初始屏幕后访问它,但我不喜欢这个解决方案,我不想在外面暴露标签。
尝试 #1:
根据我在主 MVVM WPF 应用程序中的视图模型,我执行以下操作:
Window splashScreen = new SplashScreen("Loading ...");
启动画面window:
<Window x:Class="My.Apps.WPF.SplashScreen"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<!-- Grid row and column definitions here -->
<Label Grid.Row="0" Content="{Binding Path=Message}"/>
</Grid>
</Window>
初始屏幕代码隐藏:
public partial class SplashScreen: Window
{
public string Message
{
get
{
return (string)GetValue(MessageProperty);
}
set { SetValue(MessageProperty, value); }
}
public static readonly DependencyProperty
MessageProperty =
DependencyProperty.Register("Message",
typeof(string), typeof(System.Window.Controls.Label),
new UIPropertyMetadata("Working, wait ..."));
public SplashScreen(string message)
{
InitializeComponent();
if (!String.IsNullOrEmpty(message))
this.Message = message;
}
}
我已经为 Label.It 设置了一个默认值,如果它没有作为参数传递给构造函数,将被使用。
它不起作用,在 xaml 预览中未在 Visual Studio IDE 环境中的标签中显示默认消息。同样出于某种原因,当我将来自视图模型的自定义消息作为参数传递时,它没有显示在标签中。我做错了什么?
您没有为您的网格设置 DataContext:
<Window x:Class="My.Apps.WPF.SplashScreen"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Name="Splash"
>
<Grid DataContext="{Binding ElementName=Splash}">
<!-- Grid row and column definitions here -->
<Label Grid.Row="0" Content="{Binding Path=Message}"/>
</Grid>
</Window>
我有一个 MVVM WPF 应用程序,当完成一些较长的任务时,我会从中显示启动画面。
这个启动画面是一个典型的 WPF window,非常简单,它只有一个标签来显示自定义文本,例如 "Loading..." 和一个微调框。
它的代码隐藏只有构造函数,其中它只执行 InitializeComponent 和事件 Window_Loaded。
在我的主要 MVVM WPF 应用程序中,当我执行一项较长的任务时,我会实例化此 window 并显示启动画面。
所以现在,我想自定义启动画面中标签中显示的文本。那么最好的方法是什么?
我所做的是在实例化 window(启动画面)时将字符串(自定义消息)作为参数传递给构造函数。
Window mySplash = new SplashScreen("Loading or whatever I want");
由于这个启动画面非常简单,只有一个启动画面,我认为在这里应用 MVVM 没有任何意义,所以在代码隐藏中我创建了一个私有 属性 并设置了传递的字符串作为构造函数的参数。然后,我将视图中的标签与此私有 属性 绑定,最后在代码隐藏(视图)中实现 INotifyPropertyChanged。这里没有模型,模型视图
这是正确的做法吗?或者还有其他方法吗?
我知道还有其他解决方案,例如通过添加以下内容使 public 成为视图中的标签:
x:FieldModifier="public"
然后在我实例化初始屏幕后访问它,但我不喜欢这个解决方案,我不想在外面暴露标签。
尝试 #1:
根据我在主 MVVM WPF 应用程序中的视图模型,我执行以下操作:
Window splashScreen = new SplashScreen("Loading ...");
启动画面window:
<Window x:Class="My.Apps.WPF.SplashScreen"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<!-- Grid row and column definitions here -->
<Label Grid.Row="0" Content="{Binding Path=Message}"/>
</Grid>
</Window>
初始屏幕代码隐藏:
public partial class SplashScreen: Window
{
public string Message
{
get
{
return (string)GetValue(MessageProperty);
}
set { SetValue(MessageProperty, value); }
}
public static readonly DependencyProperty
MessageProperty =
DependencyProperty.Register("Message",
typeof(string), typeof(System.Window.Controls.Label),
new UIPropertyMetadata("Working, wait ..."));
public SplashScreen(string message)
{
InitializeComponent();
if (!String.IsNullOrEmpty(message))
this.Message = message;
}
}
我已经为 Label.It 设置了一个默认值,如果它没有作为参数传递给构造函数,将被使用。
它不起作用,在 xaml 预览中未在 Visual Studio IDE 环境中的标签中显示默认消息。同样出于某种原因,当我将来自视图模型的自定义消息作为参数传递时,它没有显示在标签中。我做错了什么?
您没有为您的网格设置 DataContext:
<Window x:Class="My.Apps.WPF.SplashScreen"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Name="Splash"
>
<Grid DataContext="{Binding ElementName=Splash}">
<!-- Grid row and column definitions here -->
<Label Grid.Row="0" Content="{Binding Path=Message}"/>
</Grid>
</Window>