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;
当我尝试这样做^时,它说用户潘的空引用
谢谢
不,永远不要那样做。创建一个绑定到 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( 个想法:
- 在视图的代码
- 隐藏中编写尽可能少的代码,并将所有逻辑放在视图模型对象中,使用 WPF 的数据绑定功能将视图模型对象的属性连接到视图的控件。
- 将逻辑与显示分开,以便可以用其他构造替换视图,而无需更改逻辑。
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;
}