C# 如何在WPF中更新运行时的可见性
我目前正在开发WPF中的汉堡包式菜单。在此菜单中,有一些类别,每个类别都有一个图标。当菜单折叠时,您仍然可以看到这些图标。当您展开菜单时,它旁边应该会出现文本。我的想法是,菜单一打开,就将它们的可见性设置为可见,但我很难意识到这一点。现在我正试图通过将它们绑定到属性来更改它们的可见性 XAML:C# 如何在WPF中更新运行时的可见性,c#,wpf,xaml,C#,Wpf,Xaml,我目前正在开发WPF中的汉堡包式菜单。在此菜单中,有一些类别,每个类别都有一个图标。当菜单折叠时,您仍然可以看到这些图标。当您展开菜单时,它旁边应该会出现文本。我的想法是,菜单一打开,就将它们的可见性设置为可见,但我很难意识到这一点。现在我正试图通过将它们绑定到属性来更改它们的可见性 XAML: C#CS级: using System.Windows; using System.Windows.Controls; namespace APP { /// <summary>
C#CS级:
using System.Windows;
using System.Windows.Controls;
namespace APP
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private bool menuOpen = false;
private int closedMenuWidth = 50;
private int openMenuWidth = 210;
private string textboxVisibility;
public string TextboxVisibility
{
get { return textboxVisibility; }
set { textboxVisibility = value; }
}
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
this.TextboxVisibility = "Hidden";
}
private void MenuButton_Click(object sender, RoutedEventArgs e)
{
if (menuOpen)
{
menuGrid.Width = closedMenuWidth;
menuOpen = false;
this.TextboxVisibility = "Hidden";
}
else
{
menuGrid.Width = openMenuWidth;
menuOpen = true;
this.TextboxVisibility = "Visible";
//foreach (ListViewItem item in menuItemsListView.Items)
//{
// item.
// if (item.Uid == "Test")
// {
// item.Visibility = Visibility.Visible;
// }
//}
}
}
}
}
使用System.Windows;
使用System.Windows.Controls;
命名空间应用程序
{
///
///MainWindow.xaml的交互逻辑
///
公共部分类主窗口:窗口
{
private bool menuOpen=false;
私有int closedMenuWidth=50;
私有宽度=210;
私有字符串textboxVisibility;
公共字符串TextboxVisibility
{
获取{return textboxVisibility;}
设置{textboxVisibility=value;}
}
公共主窗口()
{
初始化组件();
this.DataContext=this;
this.TextboxVisibility=“Hidden”;
}
私有无效菜单按钮单击(对象发送者,路由目标)
{
如果(菜单打开)
{
menuGrid.Width=closedMenuWidth;
MENOOPEN=假;
this.TextboxVisibility=“Hidden”;
}
其他的
{
menuGrid.Width=openMenuWidth;
menuOpen=true;
this.TextboxVisibility=“可见”;
//foreach(menuItemsListView.Items中的ListViewItem项)
//{
//项目。
//如果(item.Uid==“测试”)
// {
//item.Visibility=可见性.Visibility;
// }
//}
}
}
}
}
当我在MainWindow函数中更改值时,它在第一次启动时确实会对其产生影响。但其他时候,我试图改变它,这是在运行时,没有发生任何事情。我尝试过各种布尔值和绑定实际可见性类型的方法,但都没有效果。您应该在
主窗口类上实现INotifyPropertyChanged
:
public partial class MainWindow: Window,INotifyPropertyChanged {
private string textboxVisibility;
public string TextboxVisibility {
get {
return textboxVisibility;
}
set {
textboxVisibility = value;
OnPropertyChanged();
}
}
//The rest of your code goes here
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) {
PropertyChanged ? .Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
OnPropertyChanged
方法所做的是,每当设置值时,它都会通知视图并刷新它。
这将解决问题,但不是使用MVVM的正确方法
执行此操作的方法是更改TextBox的visibility属性,而不是将visibility属性绑定到值:
首先,您必须向要隐藏的文本块添加一个名称:
<ListView x:Name="menuItemsListView" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListViewItem>
<StackPanel Orientation="Horizontal">
<Image x:Uid="Test" Name="InhoudImage" Source="Images/noimage.png" Height="30" Width="auto" VerticalAlignment="Center" Margin="3,0,0,0"></Image>
<TextBlock Name="textblock" x:Uid="Test" Text="{Binding Path=TextboxVisibility}" Visibility="{Binding Path=TextboxVisibility}" VerticalAlignment="Center"></TextBlock>
</StackPanel>
</ListViewItem>
</ListView>
如果要以正确的方式实现MVVM,必须创建ViewModel类并将其作为数据上下文添加到视图中:
<Window.DataContext>
<local:MainWindowViewModel/>
</Window.DataContext>
您应该实现INotifyPropertyChanged,并在设置数据绑定属性时发出更改通知。string TextboxVisibility
?使用Visibility
type或使用bool
+converter()。@mm8这是否意味着我必须实现MVVM模式?@WouterVanNueten:不,不一定。窗口可以实现接口。将其附加到如下结尾:public partial class main window:window,INotifyPropertyChanged
,然后实现接口。这将解决他的问题,但他绝对“不应该”这样做。他应该做的是正确地实现MVVM。我添加了一个示例,这样他就可以使用MVVM而不使用it@PaulMiranda非常感谢您的全面回答!我现在有一个更好的方法来理解如何使用MVVM和不使用MVVM。我很高兴它有帮助:)
private void MenuButton_Click(object sender, RoutedEventArgs e) {
if (menuOpen) {
menuGrid.Width = closedMenuWidth;
menuOpen = false;
textblock.Visibility = System.Windows.Visibility.Hidden;
}
else {
menuGrid.Width = openMenuWidth;
menuOpen = true;
textblock.Visibility = System.Windows.Visibility.Visible;
//foreach (ListViewItem item in menuItemsListView.Items)
//{
// item.
// if (item.Uid == "Test")
// {
// item.Visibility = Visibility.Visible;
// }
//}
}
}
<Window.DataContext>
<local:MainWindowViewModel/>
</Window.DataContext>
public class MainWindowViewModel: INotifyPropertyChanged {
private string textboxVisibility;
public string TextboxVisibility {
get {
return textboxVisibility;
}
set {
textboxVisibility = value;
OnPropertyChanged();
}
}
//The rest of your code goes here
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) {
PropertyChanged ? .Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}