我有一个简单的WPF应用程序,其顶部有一个菜单。我想添加一个选项以使主窗口保持在其他窗口之上。
我在“属性”>“设置”选项卡中创建了一个名为setTopMost的布尔值,供用户保存此设置。因此,即使应用终止后,该设置也会被记住。
一切正常,我可以单击选项或使用Ctrl + T的快捷方式使窗口停留在顶部,但是当窗口打开时我无法在选项旁边显示复选标记其他窗口的顶部。
我已经阅读了几篇有关将IsChecked绑定到bool的文章,但是我无法独自解决此问题。
这是我的密码。
MainWindow.xaml
<Window.InputBindings>
<KeyBinding Gesture="Ctrl+T" Command="{Binding TopMostCommand}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
</Window.InputBindings>
<MenuItem Header="_Options">
<MenuItem x:Name="Menu_AlwaysOnTop" Header="Always On _Top" IsCheckable="True" IsChecked="{Binding isTopMost}" Command="{Binding TopMostCommand}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}}" InputGestureText="Ctrl+T" />
</MenuItem>
MainWindow.xaml.cs
namespace WPF_Practice
{
public partial class MainWindow : Window
{
public bool isTopMost;
public MainWindow()
{
InitializeComponent();
DataContext = new PracticeDataContext();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
isTopMost = Properties.Settings.Default.setTopMost;
Topmost = Properties.Settings.Default.setTopMost;
}
}
public class PracticeDataContext
{
public ICommand TopMostCommand { get; } = new TopMostCommand();
}
public class TopMostCommand : ICommand
{
public void Execute(object parameter)
{
var TopMostClass = new MainWindow();
TopMostClass.WindowTopMost();
}
public bool CanExecute(object parameter)
{
return true;
}
public event EventHandler CanExecuteChanged
{
add => CommandManager.RequerySuggested += value;
remove => CommandManager.RequerySuggested -= value;
}
}
}
请注意,这是我的业余爱好,对此还很陌生。
答案 0 :(得分:1)
MenuItem
无法正确更新的主要原因是因为您将DataContext
的{{1}}设置为Window
。
PracticeDataContext
这意味着您在public MainWindow()
{
InitializeComponent();
DataContext = new PracticeDataContext(); <--
}
中的绑定将在MainWindow.xaml
中寻找属性。
在这种情况下,您希望在PracticeDataContext
类中拥有一个IsTopMost
属性,以便使绑定起作用。
由于在PracticeDataContext
事件处理程序启动之前未设置IsTopMost
,因此应在Loaded
类中实现INotifyPropertyChanged
,以便将PracticeDataContext
绑定通过设置进行设置时会收到通知。
在IsTopMost
上进行快速搜索将显示许多示例。很简单。