C# 引用 WPF 中的网格以更改属性

本文关键字:属性 网格 引用 WPF | 更新日期: 2023-09-27 18:33:48

你好,我是Visual Studio中使用WPF和XAML制作应用程序的新手。所以我有一个网格,我想在代码中更改它的属性。

我的网格的属性:

<Grid HorizontalAlignment="Left"
              Height="603"
              Margin="0,51,0,0"
              x:Name="usersPan"
              VerticalAlignment="Top"
              Width="1286">

我一直在尝试更改其属性

        this.usersPan.SetValue(Grid.WidthProperty, PAN_SIZE);
        usersPan.SetValue(Grid.WidthProperty, PAN_SIZE);
        usersPan.Width = 0;
        usersPan.Visibility = Visibility.Collapsed;

当我尝试这样做^时,它说用户潘的空引用

谢谢

C# 引用 WPF 中的网格以更改属性

不,永远不要那样做。创建一个绑定到 Grid 的 Width 属性的 ViewModel,然后只需更改该值。

我怀疑你根本不需要这个。查看容器以及如何放置它们。

在所有这些年里,很少有我需要这样做的情况,我怀疑你不需要。告诉我你在做什么。

编辑: 你有一个需要实现 NotifyPropertyChanged 接口的 VM(我不会在这里这样做,有很多关于 hoew 的例子来做到这一点(

public class MainVM
{
    public ObservableCollection<TabVM> TabsVms {get;set;}
    public int SelectedIndex {get;set}
}

绑定到控件

<TabControl DataContext={TabsVMs} SelectedIndex="{Binding SelectedIndex}">
    ...
</TabControl>

在运行时,您可以创建几个选项卡

var TabsVMs = new ObservableCollection<TabVM>();
TabsVMs.add(new TabVM());
TabsVMs.add(new TabVM());
TabsVMs.add(new TabVM());

然后在运行时更改索引的值。

MainVm.SelectedIndex = 1

并且 共同对应 选项卡将被选中。

编辑:我还可以建议您使用 Fody 进行 MVVM 通知。此外,当涉及到绑定时,我可以建议你使用 WPF 检查器。一个方便的小工具

编写 WPF 程序的最佳方法是使用 MVVM(模型-视图-视图模型(设计模式。MVVM 背后有两 (2( 个想法:

    在视图的代码
  1. 隐藏中编写尽可能少的代码,并将所有逻辑放在视图模型对象中,使用 WPF 的数据绑定功能将视图模型对象的属性连接到视图的控件。
  2. 将逻辑与显示分开,以便可以用其他构造替换视图,而无需更改逻辑。

MVVM 本身就是一个巨大的话题。 有很多关于它的文章,以及可用于构建程序的框架。 例如,查看MVVM Light。

不知道为什么 Grid 在代码隐藏中是不可见的,但是您可以使用事件访问它的属性(但不要认为它是完美的解决方案(。

例如,添加到网格事件Loaded

<Grid HorizontalAlignment="Left"
              Height="603"
              Margin="0,51,0,0"
              x:Name="usersPan"
              VerticalAlignment="Top"
              Width="1286"
              Loaded="FrameworkElement_OnLoaded">

然后从代码隐藏中,您可以通过以下方式访问网格:

private void FrameworkElement_OnLoaded(object sender, RoutedEventArgs e)
    {
        var grid = sender as Grid;
        if (grid != null)
        {
            grid.Width = 0;
        }
    }

更好的解决方案:

将一些布尔属性添加到视图模型,例如public bool IsGridVisible{get;set;}

并将其绑定到您的网格

<Grid HorizontalAlignment="Left"
                  Height="603"
                  Margin="0,51,0,0"
                  x:Name="usersPan"
                  VerticalAlignment="Top"
                  Width="1286" 
                  Visibility="{Binding Path=IsGridVisible, Converter={StaticResource BoolToVis}">

其中 BoolToVis 是转换器,它将 true 转换为可见,将 false 转换为隐藏。您可以在 App.xaml 中定义它,如下所示:

        <BooleanToVisibilityConverter x:Key="BoolToVis" />

我能够做这样的事情,这样我就可以在事件之外更改属性。

    private Grid userGrid;
    private void onUserGridLoaded(object sender, RoutedEventArgs e)
    {
        userGrid = sender as Grid;
    }