【发布时间】:2025-12-12 10:15:01
【问题描述】:
我有一个 MVVM WPF 应用程序,在完成一些长时间的任务时,我会显示一个启动屏幕。
这个闪屏是一个典型的 WPF 窗口,非常简单,它只有一个标签来显示自定义文本,例如“正在加载...”和一个微调器。
它的代码隐藏只有构造函数,它只在其中执行 InitializeComponent 和事件 Window_Loaded。
在我的主 MVVM WPF 应用程序中,当我执行长任务时,我会实例化此窗口并显示启动屏幕。
所以现在,我想自定义初始屏幕标签中显示的文本。那么最好的方法是什么?
我所做的是在实例化窗口(启动画面)时将字符串(自定义消息)作为参数传递给构造函数。
Window mySplash = new SplashScreen("Loading or whatever I want");
由于这个闪屏非常简单,只是一个闪屏,我认为在这里应用 MVVM 没有意义,所以在代码隐藏中我创建了一个私有属性,我使用作为参数传递给构造函数的字符串来设置它。然后,我将视图中的标签与此私有属性绑定,最后在代码隐藏(视图)中实现 INotifyPropertyChanged。这里没有模型,模型视图。
这是正确的做法吗?还是有其他方法?
我知道还有其他解决方案,例如通过添加以下内容在视图中公开标签:
x:FieldModifier="public"
然后在我实例化启动画面后访问它,但我不喜欢这种解决方案,我不想将标签暴露在外面。
尝试 #1:
从我在主 MVVM WPF 应用程序中的视图模型中执行以下操作:
Window splashScreen = new SplashScreen("Loading ...");
闪屏窗口:
<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设置了一个默认值,如果它没有作为参数传递给构造函数,它将被使用。
它不起作用,在 xaml 预览中没有在 Visual Studio IDE 环境中的标签中显示默认消息。同样出于某种原因,当我将来自视图模型的自定义消息作为参数传递时,它不会显示在标签中。我做错了什么?
【问题讨论】:
-
如果你想继续使用 MVVM,你可以在你的窗口中添加一个 DependencyProperty 并将标签绑定到它。
-
这里不需要 MVVM 或私有属性,只需在构造函数中直接将标签文本设置为传递的字符串即可。当然,您应该确保您没有在主应用程序中从您的视图模型中实例化该窗口,因为它会破坏整个概念。
-
@Evk 是的,我将从我的视图模型中实例化启动屏幕,并在实例化时传递自定义字符串。那么更好地使用dependencyProperty?正如 ManfredRadlwimmer 所说。
-
@user1624552 不是真的,附加属性当然也可以,但似乎是不必要的开销。
-
您可以将一些接口 (
IProgressDialog) 传递给您的视图模型,例如,它将具有Show(string text)和Hide方法。使用 MVVM 的主要目标之一是将视图与模型分离。例如,您可能希望将视图模型与另一个 UI(例如在 Android 应用程序中)一起使用。从视图模型创建窗口(这是 WPF 控件)会阻止这样做。
标签: c# wpf mvvm inotifypropertychanged