我一直在使用WPF一段時間,並且遇到了困難,只能從我的MainWindow強制打開一個窗口的一個實例。我一直在試圖找出我選擇的解決方案是否是最好的解決方案,但似乎並沒有太多關於這個問題的方法。讓我想知道我是否完全錯誤地做了這件事。你如何只允許一個繼承窗口的實例打開?
我試圖解決的原始問題只允許打開一個窗口的一個實例,我使用單例模型來完成。它結束了工作很好,但我有兩個窗口我想打開,我想這個功能。我認爲這將是一個很好的做一個「BaseWindow」繼承,所以我只需要實現這一次。那就是我陷入困境的地方。
我已經創建了一個非常簡單的項目,我試圖實現這個想法,但是由於WindowBase構造函數是私有的,所以我在AboutWindow的公共構造函數中遇到了保護級錯誤。將它更改爲public允許程序編譯,但它似乎「跳過」具有「InitializeComponent」的AboutWindow構造函數。
但是,作爲一個方面說明,只允許一個實例的部分確實可行。如果我能得到IniliatizeCompotent的構造函數來工作,我將被設置。爲了澄清,從WindowBase派生的任何窗口都可以同時打開。所以在這種情況下,一次只有一個OptionWindow,一個AboutWindow。
MainWindow.xaml:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="181" Width="259">
<DockPanel>
<Menu DockPanel.Dock="Top">
<MenuItem Header="_File"></MenuItem>
<MenuItem Header="_Tools">
<MenuItem Header="_Options" ></MenuItem>
</MenuItem>
<MenuItem Header="_Help">
<MenuItem Header="_About" Click="AboutMenuItem_Click"></MenuItem>
</MenuItem>
</Menu>
<Grid>
<TextBlock Text="Content would go here"></TextBlock>
</Grid>
</DockPanel>
</Window>
MainWindow.xaml.cs:
using System.Windows;
namespace WpfApplication1 {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
private void AboutMenuItem_Click(object sender, RoutedEventArgs e) {
AboutWindow.Instance.Show();
}
}
}
AboutWindow.xaml:
<src:WindowBase x:Class="WpfApplication1.AboutWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:src="clr-namespace:WpfApplication1"
Title="AboutWindow" Height="300" Width="300">
<Grid>
<Label Content="Label" HorizontalAlignment="Left" Margin="84,74,0,0" VerticalAlignment="Top"/>
</Grid>
</src:WindowBase>
AboutWindow.xaml.cs:
namespace WpfApplication1 {
/// <summary>
/// Interaction logic for AboutWindow.xaml
/// </summary>
public partial class AboutWindow : WindowBase {
public AboutWindow() {
InitializeComponent();
}
}
}
個
WindowBase.cs:
using System;
using System.Windows;
namespace WpfApplication1 {
public partial class WindowBase : Window {
private static WindowBase instance;
static WindowBase() {
}
private WindowBase() {
Closed += AbstractWindow_Closed;
}
public static WindowBase Instance {
get {
if (instance == null) {
instance = new WindowBase();
} return instance;
}
}
private void AbstractWindow_Closed(object sender, EventArgs e) {
instance = null;
}
}
}
恰恰是缺少一塊拼圖或我要對這個錯誤的方式是什麼?
你的問題是WindowBase中的Instance屬性創建一個WindowBase對象,而不是一個AboutWindow對象。 – elgonzo
首先,用以下信息更新你的問題:假設你有兩個窗口類型A和B,它們都來自WindowBase。現在,您是想要只打開一個A還是隻打開一個B,還是可以同時打開一個窗口A和一個窗口B? – elgonzo
更新了我的問題。我正在尋找後者,同時開放一個窗口A和一個窗口B.在這種情況下,一個OptionWindow和一個AboutWindow。 – Rakshasas