如果我有用户设置ToggleThis
我希望在菜单中为用户提供此设置,例如Settings / ToggleSettings。点击它。每次单击都应切换用户设置true / false,同时更新menuItem图标以显示实际设置。
我可以使用
执行此操作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="350" Width="525">
<Grid>
<Menu IsMainMenu="True">
<MenuItem Header="_Settings">
<MenuItem Header="_Toggle" Name="ToggleSettings" Click="MenuItem_Click">
<MenuItem.Icon>
<Image Source="Images/Toggle.png" />
</MenuItem.Icon>
</MenuItem>
</MenuItem>
</Menu>
</Grid>
</Window>
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
if (ToggleSettings.Icon == null)
{
Uri Icon = new Uri("pack://application:,,,/Images/" + "Toggle.png");
ToggleSettings.Icon = new Image
{
Source = new BitmapImage(Icon)
};
Properties.Settings.Default.toggleThis = true;
}
else
{
ToggleSettings.Icon = null;
Properties.Settings.Default.toggleThis = false;
}
}
}
}
但是,我知道这不是正确的方法,例如,在启动时,菜单可能不会基于先前的设置处于正确的状态。麻烦的是,我不知道正确的方法。谁能给我一些关于正确方法的指示?
我假设我需要对MenuItem中的图标和/或某些值使用绑定,但实际上并不知道从哪里开始。
谢谢
答案 0 :(得分:1)
如果您认为合适,则需要致电Save
。
Properties.Settings.Default.Save();
你是如何使用它的并不完全清楚,但这将确保至少存储更新后的值。
答案 1 :(得分:1)
实际上没有“正确”的方式,只有最有效的方法,以及最合适的情况。
您的示例看起来很好,至少到目前为止,您唯一的问题是,您不会将所选选项与用户选择/未选择的内容同步,上次他们使用软件
这只需要将两小段代码放在两个特定位置。
MenuItem_Click
。只需确保在调用Settings.Sav
e之前,方法不会以某种方式退出... try
/ catch
以优雅的方式确保一致的设置状态是谨慎的。 促进这一点的最佳方法是使用私有方法,该方法负责更改菜单项上显示的图标,以及将最新状态存储在应用程序的设置中。也许是一种名为Toggle()
的方法,您可以在MenuItem_Click
方法中调用该方法。您需要提供有问题的菜单项和ID,但这可用于访问代码隐藏中的菜单项。同样,这个代码示例假设您的图标也存储在设置中,尽管图标可以来自任何地方,只要您可以引用它们。
所以你的代码可能是这样的,尽管不是这样:
public MainWindow()
{
InitializeComponent();
this.SetToggleIcon(Properties.Settings.Default.toggleThis);
}
private void Toggle()
{
this.StoreToggleState(!Properties.Settings.Default.toggleThis);
this.SetToggleIcon(Properties.Settings.Default.toggleThis);
}
private void SetToggleIcon(bool state)
{
this.menuItem_ToggleSettings.Icon = (Properties.Settings.Default.toggleThis) ? Properties.Settings.Default.IconTrue : Properties.Settings.Default.IconFalse;
}
private void StoreToggleState(bool state)
{
Properties.Settings.Default.toggleThis = state;
Properties.Settings.Default.Save();
}
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
this.Toggle();
}