WPF(MVVM)菜单栏小勾与窗口绑定

时间:2022-08-08 10:09:39

窗口打开,前面菜单栏前面小勾(图标显示)

代码和我上一编差不多,只不过在菜单界面,也就是主界面中加了一个定时器,去定时查看窗口就否开启。

IsCheckable="True"   是否显示小勾     IsChecked="True"第一次开启时 小勾能显示 因为我的工具窗口,软件一开启就会打开。

  MainPageViewModel mainpageviewmodel;
public MainPage()
{
InitializeComponent();

//在这里窗体加载的时候不执行文本框赋值,
//窗体上不会及时的把时间显示出来,而是等待了片刻才显示了出来
ShowTime();
ShowTimer = new System.Windows.Threading.DispatcherTimer();
ShowTimer.Tick += new EventHandler(ShowCurTimer);//起个Timer一直获取当前时间
ShowTimer.Interval = new TimeSpan(0, 0, 0, 1, 0);
ShowTimer.Start();

mainpageviewmodel = new MainPageViewModel( );
this.DataContext = mainpageviewmodel;
}

这里是主窗口中,我本来就是要显示时间的。所以直接在这个定时器中判断了

 //定时器时间显示
public void ShowCurTimer(object sender, EventArgs e)
{
ShowTime();
//加上一些判断
//菜单中 工具栏小勾显示问题
if (mainpageviewmodel.toolflag == 1)
{
tool.IsChecked = true;
}
else
{
tool.IsChecked = false;
}

}
//ShowTime方法
private void ShowTime()
{
//获得年月日
this.tbDateText.Text = DateTime.Now.ToString("yyyy/MM/dd"); //yyyy/MM/dd
//获得时分秒
this.tbTimeText.Text = DateTime.Now.ToString("HH:mm:ss");
}
当然,这里也能判断
mainpageviewmodel.toolbar==null;
toolbar窗口是不是为NULL;

 ///工具栏
///提升为公有方法,给热键(T)使用
/// </summary>
public void ToolBarExecute(Window window)
{
if (toolbar == null)
{
toolflag = 1;
//传参绑定
toolbar = new MyToolBar( this);
//固定窗口位置
toolbar.WindowStartupLocation = WindowStartupLocation.Manual;
toolbar.Left = 0;
toolbar.Top = 80;
toolbar.Owner = window;
toolbar.Show();
win.Add(toolbar);
}
else if(toolbar !=null )
{
//再次点击关闭窗口
toolbar.Close();
toolbar = null;
toolflag = 0;
win.Remove(toolbar);
}
这里的win是个
  //关闭窗口链表
   List<Window> win=new List<Window> ();

主要是切换用户时  打开的窗口没关闭BUG,这时

 public void LogoutCommandExecute(Window window)
{
/*打开登入窗口*/
Shell shell = new Shell();
shell.Show();

/*关闭当前窗口*/
if (window != null)
{
//window.Close();
//重写后 不能直接调用,
//注销前 关闭子窗口 当窗口过多可以用数组或链表
if (p_rail != null)
{
p_rail.Close();
p_rail = null;
}
//链表关闭
foreach (Window s in win)
{
s.Close();
}
//主窗口休眠
window.Hide();
window = null;
}

这里Sell为登入界面。。。

这里我重写了主窗口的关闭函数  主要是为了能在关闭时弹窗提示时否关闭程序。。。。