Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在WPF中更新运行时的可见性_C#_Wpf_Xaml - Fatal编程技术网

C# 如何在WPF中更新运行时的可见性

C# 如何在WPF中更新运行时的可见性,c#,wpf,xaml,C#,Wpf,Xaml,我目前正在开发WPF中的汉堡包式菜单。在此菜单中,有一些类别,每个类别都有一个图标。当菜单折叠时,您仍然可以看到这些图标。当您展开菜单时,它旁边应该会出现文本。我的想法是,菜单一打开,就将它们的可见性设置为可见,但我很难意识到这一点。现在我正试图通过将它们绑定到属性来更改它们的可见性 XAML: C#CS级: using System.Windows; using System.Windows.Controls; namespace APP { /// <summary>

我目前正在开发WPF中的汉堡包式菜单。在此菜单中,有一些类别,每个类别都有一个图标。当菜单折叠时,您仍然可以看到这些图标。当您展开菜单时,它旁边应该会出现文本。我的想法是,菜单一打开,就将它们的可见性设置为可见,但我很难意识到这一点。现在我正试图通过将它们绑定到属性来更改它们的可见性

XAML:


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));
      }
    }