将您的汉堡设置为打开的原因是因为它的IsOpen 属性的后备值为True。并且可能{Binding} 失败了,因为它无法访问它或者它只是找不到它。因为您使用的是UWP 和Template10。我会建议:
- 使用
{x:Bind} 而不是{Binding},因为这样您就可以知道编译器是否可以找到您提供的绑定参考。
- 在
viewModel 的Shell.xaml 中创建a 属性(假设您使用的是Hamburger Template)或者如果不是?然后在使用HamburgerControl 的View 的viewModel 中创建一个属性。
- 现在在
property 中,您从Get 中的SettingsPageViewModel.SettingsPartViewModel.HamburgerIsOpen 获取数据,并将新值更新为set 中的相同值。这样您就可以在使用汉堡包的视图的viewModel 中获得所需的数据。
- 现在将
x:Bind IsOpen 属性添加到Mode=TwoWay 中的属性。现在您将拥有一个功能齐全的汉堡菜单,其中包含恢复状态。 注意:如果您是 x:Binding 您的属性,请确保在绑定中添加 ViewModel. 前缀并将 <DataContext> 命名为 ViewModel。
抱歉,我不得不删除所有代码,可能是因为我将把代码放在这里,旧的代码不再相关或可以从编辑中找到。
说到重点,我已经解决了这个问题,似乎有一些调用服务调用了 Hamburger 控件并将值设置为 false当视图尚未加载时。我想出了一个相当厚颜无耻的方法来得到一个相当整洁的工作,有些人可能会说这并不理想,但它是一个修复。
代码:
在您的 Shell.xmal 全局中创建一个 bool 属性,例如:private bool loaded = false;。这是一个属性,可以帮助我们知道视图是否已加载,因为对 setter 的所有调用都是在应用程序尚未加载时进行的,似乎可以绕过它并只允许 getter 访问它。
现在在你的 Shell.xaml 构造函数中订阅 shell.Loaded 事件,
例如:this.Loaded += Shell_Loaded; //in the shell.xmal.cs constructor
和Shell_Loaded 事件:
private void Shell_Loaded(object sender, RoutedEventArgs e)=>
loaded = true;
注意方法语法是c# 6.0中使用的,低版本请使用传统的{}。
还在shell.xaml.cs 中添加bool 属性来处理汉堡菜单的打开/关闭
public bool IsHamOpen
{
get
{
return (new ViewModels.SettingsPageViewModel()).SettingsPartViewModel.IsHamOpen;
}
set
{
if (!value)
{
if (loaded)
{
(new ViewModels.SettingsPageViewModel()).SettingsPartViewModel.IsHamOpen = value;
}
else
(new ViewModels.SettingsPageViewModel()).SettingsPartViewModel.IsHamOpen = true;
}
else
(new ViewModels.SettingsPageViewModel()).SettingsPartViewModel.IsHamOpen = value;
}
}
请注意:我正在创建 ViewModel 的一个实例,以便通过 settingsViewModel 更改所有设置。如果某些设置开始变得有趣,我们会知道在哪里可以找到它们。
您的 Shell.xaml
在您的汉堡控件中,将其链接到属性背后的代码,
<Controls:HamburgerMenu x:Name="MyHamburgerMenu" IsOpen="{x:Bind IsHamOpen,Mode=TwoWay}">
在SettingsPageViewModel:
创建一个属性来处理对汉堡菜单所做的更改。通过这种方式,您还可以为用户提供一个简单的切换开关,以默认打开或关闭他的汉堡包。
public bool IsHamOpen
{
get { return _settings.IsHamOpen; }
set
{
_settings.IsHamOpen = value;
base.RaisePropertyChanged();
//the below is to hide and show the hamburger button.
//If the it's open then hide button
//else show the button to open it.
//this is just as per your requiremnts.
//I just wanted to put it in
ShowHamburgerButton = !value;
}
}
在您的设置服务中:
添加一个属性来读取和写入设置并将它们应用到汉堡控件:
public bool IsHamOpen
{
get { return _helper.Read<bool>(nameof(IsHamOpen), false); }
set
{
_helper.Write(nameof(IsHamOpen), value);
Views.Shell.HamburgerMenu.IsOpen = value;
}
}
最后是设置视图
这完全是可选的。如果您希望用户能够设置他对汉堡包控件的偏好,那么给 ViewModel 一个简洁的 toggleSwitch 和 x:Bind。
<ToggleSwitch x:Name="OpenHamWhenStart"
Header="Default Hamburger Open or Close"
IsOn="{Binding IsHamOpen, Mode=TwoWay}"
OffContent="Hamburger Menu is Closed"
OnContent="Hamburger Menu is Open"
RelativePanel.AlignLeftWithPanel="True"
RelativePanel.Below="BusyTextTextBox" />
你有它。如果有任何问题,请告诉我。您可以在 cmets 部分与我联系